home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / program / oxcc1434.zip / SRC / OXBOW.H < prev    next >
C/C++ Source or Header  |  1996-03-22  |  71KB  |  2,404 lines

  1. /* OXBOW.H a conglomeration of .h files */
  2.  
  3. #include <setjmp.h>
  4.  
  5. #define PLATFORM_WIN32    0x00000070
  6. #define PLATFORM_32s    0x00000010
  7. #define PLATFORM_95     0x00000020
  8. #define PLATFORM_NT     0x00000040
  9.  
  10. #define PLATFORM_WIN16    0x00000080
  11. #define PLATFORM_WIN30  0x00000080
  12. #define PLATFORM_WIN31    0x00000081
  13. #define PLATFORM_WFW31  0x00000082
  14. #define PLATFORM_WINOS2 0x00000083
  15.  
  16. #define PLATFORM_OS2    0x00000100
  17. #define PLATFORM_LINUX    0x00000200
  18.  
  19. #ifndef SUPPORT_LONG_LONG
  20. #define SUPPORT_LONG_LONG 1
  21. #endif
  22.  
  23. #ifndef SUPPORT_LONG_DOUBLE
  24. #define SUPPORT_LONG_DOUBLE 0
  25. #endif
  26.  
  27. #if SUPPORT_LONG_LONG
  28. #define _LONGLONG_ long long
  29. #else
  30. #define _LONGLONG_ double
  31. #endif
  32.  
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36.  
  37. enum evTypes {
  38. #undef defEvent
  39. #define defEvent(a,b) \
  40. a=b,
  41. #include <oxevents.h>
  42. };
  43.  
  44. #undef max
  45. #define max(a,b) \
  46. ({typedef _ta = (a), _tb = (b); \
  47. _ta _a = (a); _tb _b = (b); \
  48. _a > _b ? _a : _b; })
  49.  
  50. #undef min
  51. #define min(a,b) \
  52. ({typedef _ta = (a), _tb = (b); \
  53. _ta _a = (a); _tb _b = (b);\
  54. _a < _b ? _a : _b; })
  55.  
  56. #define ROUNDING(a,b) ((a+(b-1))&~(b-1))
  57. #define ROUNDUP(a,b) a = ROUNDING(a,b)
  58. #define round_up(a,b) ROUNDING(a,b)
  59. #define CALLER(a) (((unsigned*)&a)[-1])
  60.  
  61. typedef unsigned long SIZE_T;
  62.  
  63. /* deal with lack of support for _stdcall */
  64. #define RETURN_WINAPI(PAR) \
  65.     __asm__ ("1:nop\n\tnop\n\t.stabs \"__RetNT\",36," #PAR ",0,1b-2\n");
  66. #define RETURN_CALLBACK(PAR) \
  67.     __asm__ ("1:nop\n\tnop\n\t.stabs \"__RetNT\",36," #PAR ",0,1b-2\n");
  68. #define RETURN_EXPORT(PAR) \
  69.     __asm__ ("1:nop\n\tnop\n\t.stabs \"__RetNT\",36," #PAR ",0,1b-2\n");
  70.  
  71. /* CFF.H    -- user api include file for the cff library */
  72. #ifndef __ITEMH__
  73. #define __ITEMH__
  74. #if SUPPORT_LONG_LONG
  75. typedef unsigned long long  KeyItem;   /* type for a key's associated item */
  76. #else
  77. typedef double KeyItem;
  78. #endif
  79. #endif __ITEMH__
  80.  
  81. typedef union             /* 2 BYTES */
  82.     {
  83.         unsigned short val;
  84.         unsigned char b[2];
  85. } SVAL;
  86.  
  87. typedef union            /* 4 BYTES */
  88.     {
  89.     unsigned long a0;
  90.     void *a1;
  91.     struct
  92.         {
  93.         SVAL    lo_word;
  94.         SVAL    hi_word;
  95.         } a2;
  96.     struct
  97.         {
  98.             unsigned int pad :28;
  99.             unsigned int type :4;
  100.         } a3;
  101.     struct
  102.         {
  103.             unsigned char b[4];
  104.         } a4;
  105.     int a8;
  106.     short a9;
  107.     char a10;
  108.     float a11;
  109. } ADDR;
  110.  
  111. #ifndef __STORH__
  112. #define __STORH__
  113. typedef union _stor    /* 8 BYTES */
  114.     {
  115.     KeyItem item;
  116.     unsigned long    a0;
  117.     void *a1;
  118.     struct 
  119.     {
  120.         unsigned char b0 : 3;
  121.         unsigned char b1 : 1;
  122.         unsigned char b2 : 1;
  123.         unsigned char b3 : 1;
  124.         unsigned char b4 : 2;
  125.     } bits;
  126.     struct
  127.         {
  128.         unsigned short    lo_word;
  129.         unsigned short    hi_word;
  130.         unsigned int size :28;        /* in bytes or nibbles */
  131.         unsigned int type :4;        /* describes the STOR type */
  132.         } a2;
  133.     struct
  134.         {
  135.             short s0;
  136.             short s1;
  137.             short s2;
  138.             short s3;
  139.         } a3;
  140.     struct
  141.         {
  142.             unsigned long    s0;
  143.             unsigned long    s1;
  144.         } a4;
  145.     struct
  146.         {
  147.             long    s0;
  148.             long    s1;
  149.         } a4s;
  150.     struct
  151.         {
  152.             void    *a0;
  153.             void    *a1;
  154.         } a4a;
  155.     struct
  156.         {
  157.             unsigned char    b[8];
  158.         } a5;
  159.     struct
  160.         {
  161.             signed char    b[8];
  162.         } a5t;
  163. #if SUPPORT_LONG_LONG
  164.     struct
  165.         {
  166.             unsigned long long dupname :48;
  167.             unsigned long long dupid :16;
  168.         } a6;
  169. #endif
  170.     struct
  171.         {
  172.             unsigned int home : 30;
  173.             unsigned int full : 2;
  174.         } a7;
  175.     int a8;
  176.     short a9;
  177.     char a10;
  178.     float a11;
  179.     double a12;
  180. #if SUPPORT_LONG_LONG
  181.     long long a13;
  182.     unsigned long long a14;
  183. #endif
  184.     unsigned char    Uuchar;
  185.     char            Uchar;
  186.     unsigned short    Uushort;
  187.     short            Ushort;
  188.     unsigned int    Uuint;
  189.     int                Uint;
  190.     unsigned long     Uulong;
  191.     long            Ulong;
  192. #if SUPPORT_LONG_LONG
  193.     unsigned long long Uulonglong;
  194.     long long        Ulonglong;
  195. #endif
  196.     void *            Upointer;
  197.     float            Ufloat;
  198.     double            Udouble;
  199. } STOR, Item;
  200. #endif __STORH__
  201.  
  202. /* DEFINITIONS FOR "a2.type */
  203. #define STO_INACTIVE (0)
  204. #define STO_NIL  (1)
  205. #define STO_VALUE (2)    
  206. #define STO_CHUNK (3)
  207. #define STO_KEYINFO (4)
  208. #define STO_NILCHUNK (5)
  209. #define STO_COMPCHUNK (6)
  210. #define STO_ALLOCATED (7)
  211. #define STO_DELETED (8)    /* always ored with non zero */
  212. #define STOMASK (7)
  213.  
  214. typedef struct {
  215.     unsigned long    name;
  216.     unsigned short    xname;
  217.     unsigned short    id;
  218. } DupName;
  219.  
  220. typedef struct            /* 12 BYTES */
  221.     {
  222.         STOR c0;
  223.         ADDR c1;
  224.     } CAT;
  225. #define CATEXACT  (8)
  226. #define CATHASH (cat.c1.a0)
  227.  
  228. typedef struct    /* 20 bytes */
  229.     {
  230.         STOR    stor;
  231.         CAT        cat;
  232. } SDB;
  233.  
  234.  
  235. /* DEFINE CFF OPEN MODES */
  236.  
  237. #define F_RDONLY    (0x0001)
  238. #define F_WRONLY    (0x0002)
  239. #define F_RDWR        (0x0003)
  240. #define F_CREAT        (0x0004)
  241. #define F_TEMP        (0x0008)
  242. #define F_UNIQ        (0x0010)
  243. #define F_EXCL        (0x0020)
  244. #define F_BITMAP    (0x0040)
  245. #define F_TRUNC        (0x0080)
  246. #define F_APPEND    (0x0100)
  247. #define F_DELETING    (0x0200)
  248. #define F_FILEONLY    (0x0400)
  249. #define F_BIGDIR    (0x0800)
  250. #define F_HUGEDIR    (0x1000)
  251. #define F_SETUP        (0x4000)
  252. #define F_PARENTS    (0x4000)
  253. #define F_SORTED    (0x8000)
  254. #define F_UNTAGGED    (0x10000)
  255. #define F_STAT        (0x20000)    /* TRULY READONLY */
  256. #define F_TEXT        (0x40000)    /* DOS crap, default mode is binary */
  257. #define F_ZIPFILE    (0x80000)    /* compress the file aspect */
  258. #define F_ZIPDATA    (0x100000)    /* compress data chunks */
  259. #define F_TEMPFILE    (F_RDWR|F_CREAT|F_UNIQ|F_TEMP)
  260.  
  261. /* BUFFER RELEASE MODES */
  262. #define R_DIRTY        (0x80000000)
  263. #define R_CLEAN        (0x40000000)
  264. #define R_FLUSH        (0x20000000)
  265.  
  266. /* DEFINE SOME SYSTEM CALL VALUES */
  267. #define S_READBLK (1)
  268. #define S_WRITEBLK (2)
  269. #define S_GETSPACE (3)
  270. #define S_GIVESPACE (4)
  271. #define S_CLOSE (5)
  272. #define S_OPEN (6)
  273. #define S_CREATE (7)
  274. #define S_UNLINK (8)
  275. #define S_SEEK (9)
  276. #define S_FLUSH (10)
  277. #define S_CLOSETRUNC (11)
  278.  
  279. #define S_SET (0)
  280. #define S_CUR (1)
  281. #define S_END (2)
  282.  
  283. /* DEFINE CFF OBJECT PROPERTIES -- returned by cfobtype(void *something) */
  284. #define OB_SHARE    (0x00000001)
  285. #define OB_ISDIR    (0x00000002)
  286. #define OB_BMOK        (0x00000004)
  287. #define OB_SMOK        (0x00000008)
  288. #define OB_MEM        (0x00000010)
  289. #define OB_RAWDEV    (0x00000020)
  290. #define OB_CFILE    (0x00000040)
  291. #define OB_SETUP    (0x00000080)
  292. #define OB_FOD        (0x00000100)
  293. #define OB_ROOTDIR    (0x00000200)
  294. #define OB_DIRTY    (0x00000400)
  295. #define OB_DELCLOSE    (0x00000800)
  296. #define OB_WRITE    (0x00001000)
  297. #define OB_BITMAP    (0x00002000)
  298. #define OB_XFILE    (0x00004000)
  299. #define OB_ISNEW    (0x00008000)
  300. #define OB_SMEM        (0x00010000)
  301. #define OB_FILEONLY    (0x40000000)
  302. #define OB_HASHDIR    (0x20000000)
  303. #define OB_TREEDIR    (0x10000000)
  304. #define OB_UNTAGGED (0x08000000)
  305. #define OB_PREALLOC (0x01000000)
  306. #define OB_ZIPFILE    (0x00800000)
  307. #define OB_ZIPDATA    (0x00400000)
  308. #define OB_CHUNK    (0x00200000)
  309. #define OB_VALUE    (0x00100000)
  310.  
  311. #ifndef NULL
  312. #define NULL ((void *)0)
  313. #endif
  314.  
  315. #ifndef EOF
  316. #define EOF     (-1)
  317. #endif
  318.  
  319. #define YES     (1)
  320. #define NO      (0)
  321. #define OK      (1)
  322. #define NODUPS    (0)
  323. #define OKDUPS    (1)
  324. #define CNTDUPS (2)
  325. #define DUPNAMES (4)
  326.  
  327. #define PREALLOC1 (8)
  328. #define PREALLOC2 (16)
  329. #define PREALLOC3 (32)
  330.  
  331. #define ERROR   (-1)
  332. #define FOUND    (1)
  333. #define NOTFOUND (0)
  334. #define NONE    (-1)    /* no value */
  335. #define INVALID (-4)    /* invalid value */
  336. #define LESS    (-1)    /* a is less than b */
  337. #define EQUAL    (0)        /* a and b are equal */
  338. #define GREATER    (2)        /* a is greater than b */
  339. #define    BOI    (-2)        /* beginning of index */
  340. #define    EOI    (-3)        /* end of index */
  341.  
  342. typedef struct opninfo {
  343.     long initial_entries;
  344.     unsigned long bitmap_prealloc;
  345.     long data_prealloc;
  346. } OPNINFO;
  347.  
  348. typedef struct cfdirent {
  349.     int d_namlen;
  350.     char *d_name;
  351.     unsigned long d_bytesalloc;
  352.     unsigned long d_bytesused;
  353.     unsigned long d_mode;
  354.     unsigned long d_entrycnt;
  355.     unsigned long d_ino;
  356.     unsigned long d_mtime;
  357.     unsigned long d_ctime;
  358.     void *d_fpt;
  359. } CFDIRENT;
  360.  
  361. /* Function codes for the cfmisc instruction */
  362. enum CfMisc {
  363.     CF_ALLOC,CF_USED,CF_DEPTH,CF_MARK,CF_HEAD,CF_TAIL,CF_NEXT,
  364.     CF_PREV,CF_KEYLEN,CF_DATALEN,CF_MODBUFS,
  365.     CF_CURBUFS,CF_SETKEYCMP,CF_SETITEMCMP,CF_SETERRFUNC,
  366.     CF_LAZY,CF_VERYLAZY,CF_CLRLAZY,CF_ISNEW,CF_FLUSH,
  367.     CF_FILESIZE,CF_FILEALLOC,CF_PREALLOC,CF_ALIGNMENT,
  368.     CF_MAPSIZE,CF_ISSORTED,CF_KEY,CF_ITEM,CF_CREEP,
  369.     CF_SETPRINTFUNC,CF_DATA,CF_GETMARK,CF_SETMARK
  370. };
  371.  
  372. typedef struct cfstat {
  373.         unsigned long    st_smhead;
  374.         unsigned long    st_smtail;
  375.         unsigned short    st_id;
  376.         unsigned short    st_keysize;
  377.  
  378.         STOR           st_dups;
  379.         unsigned long  st_bmhead;
  380.         unsigned long  st_bmtail;
  381.         unsigned long  st_mode;
  382.         short st_uid;
  383.         short st_gid;
  384.         long  st_mtime;
  385.         long  st_ctime;
  386.  
  387.         unsigned long  st_highleaf;
  388.         unsigned long  st_size;
  389.         unsigned long  st_alloc;
  390.         unsigned long  st_entrycnt;
  391.         short            st_mapsize;
  392.         unsigned short st_dupids;
  393.  
  394.         long  st_atime;
  395.         long  st_filesize;
  396.         long  st_filealloc;
  397.         long  st_obtype;
  398.         unsigned int st_filedups;
  399.         long  st_ino;
  400.         short st_blksize;
  401.         short st_dev;
  402.         short st_nlink;
  403.         short st_rdev;
  404. } CFSTAT;
  405.  
  406. /* MODE BITS */
  407. #define M_AFMT        (0x30000000)
  408. #define M_ROOTDIR    (0x80000000)
  409. #define M_FILEONLY    (0x40000000)
  410. #define M_HASHDIR    (0x20000000)
  411. #define M_TREEDIR    (0x10000000)
  412. #define M_UNTAGGED    (0x08000000)
  413. #define M_BITMAP    (0x04000000)
  414. #define M_EXTRNFILE    (0x02000000)
  415. #define M_PREALLOC    (0x01000000)
  416. #define M_ZIPFILE    (0x00800000)
  417. #define M_ZIPDATA    (0x00400000)
  418. #define M_CHUNK        (0x00200000)
  419. #define M_VALUE        (0x00100000)
  420. #define M_IFMT        (0x0000F000)
  421. #define M_IFDIR        (0x00004000)
  422. #define M_IFIFO        (0x00002000)
  423. #define M_IFCHR        (0x00001000)
  424. #define M_IFBLK        (0x00003000)
  425. #define M_IFREG        (0x00008000)
  426. #define M_IREAD        (0x00000100)
  427. #define M_IWRITE    (0x00000080)
  428. #define M_IEXEC        (0x00000040)
  429.  
  430.  
  431. extern void *PERMCAT;
  432. extern void *PERMINFO;
  433. extern void *PERMFILE;
  434. extern void *MEMTEMP;
  435. #define MEMTMP MEMTEMP
  436.  
  437. extern char *cff_version;
  438. extern char *cff_copyright;
  439.  
  440.  
  441.  
  442. /* STDIO STUFF */
  443. #ifndef __STDIOH__
  444. #define __STDIOH__
  445.  
  446. #define __BUFSIZ_  (4096)
  447.  
  448. extern  struct  cf_iobuf {
  449.     int      _cnt;
  450.     char*    _ptr;
  451.     char*    _base;
  452.     int         _bufsiz;
  453.     short     _flag;
  454.     unsigned char     _file;
  455.     char     _sbuf;
  456. } cf_iob[];
  457. #endif /* __STDIOH__ */
  458.  
  459. #define cfstdin     (&cf_iob[0])
  460. #define cfstdout    (&cf_iob[1])
  461. #define cfstderr    (&cf_iob[2])
  462. #define cfstdaux    (&cf_iob[3])
  463. #define cfstdprn    (&cf_iob[4])
  464.  
  465. extern void *cf_filelist[];
  466.  
  467. typedef struct cf_iobuf cfFILE;
  468.  
  469. #define cf_IOFBF    (00000)
  470. #define cf_IOREAD   (00001)
  471. #define cf_IOWRT    (00002)
  472. #define cf_IONBF    (00004)
  473. #define cf_IOMYBUF  (00010)
  474. #define cf_IOEOF    (00020)
  475. #define cf_IOERR    (00040)
  476. #define cf_IOSTRG   (00100)
  477. #define cf_IOLBF    (00200)
  478. #define cf_IORW     (00400)
  479. #define cf_IOAPPEND (01000)
  480. #define cf_IOTEXT   (02000)  /* for MSDOS cr/lf style files */
  481.  
  482.  
  483. #define cfgetc(p) (--(p)->_cnt>=0 ? \
  484.   (int)(*(unsigned char*)(p)->_ptr++) : \
  485.   cf_filbuf(p))
  486. #define cfputc(x,p) (--(p)->_cnt>=0? \
  487.   ((int)((unsigned char)((*(p)->_ptr++=(unsigned)(x))))): \
  488.   cf_flsbuf((unsigned)(x),p))
  489.  
  490. #define cfclearerr(p) ((p)->_flag &= ~(cf_IOERR|cf_IOEOF))
  491. #define cfgetchar()   cfgetc(cfstdin)
  492. #define cfputchar(x)  cfputc(x,cfstdout)
  493. #define cffeof(p)     (((p)->_flag&cf_IOEOF)!=0)
  494. #define cfferror(p)   (((p)->_flag&cf_IOERR)!=0)
  495. #define cffileno(p)   (cf_filelist[(p)->_file])
  496.  
  497. int    cf_filbuf(cfFILE*);
  498. int    cf_flsbuf(unsigned, cfFILE*);
  499. int    cffclose(cfFILE*);
  500. cfFILE*  cffdopen(void *, const char*);
  501. int    cffflush(cfFILE*);
  502. int    cffgetc(cfFILE*);
  503. char*  cffgets(char*, int, cfFILE *);
  504. cfFILE*  cffopen(const char*, const char*);
  505. int    cffputc(int, cfFILE*);
  506. int    cffputs(const char*, cfFILE*);
  507. int    cffread(void*, int, int, cfFILE*);
  508. cfFILE*  cffreopen(const char*, const char*, cfFILE*);
  509. int    cffseek(cfFILE*, long, int);
  510. long   cfftell(cfFILE *);
  511. int    cffwrite(const void*, int, int, cfFILE*);
  512. char*  cfgets(char*);
  513. int    cfgetw(cfFILE*);
  514. int    cfputs(const char*);
  515. int    cfputw(int, cfFILE*);
  516. void   cfrewind(cfFILE*);
  517. int    cfsetbuf(cfFILE*, char*);
  518. int    cfsetbuffer(cfFILE*, char*, int);
  519. int    cfsetlinebuf(cfFILE*);
  520. int    cfsetvbuf(cfFILE*, char*, int, int);
  521. int    cfungetc(int, cfFILE*);
  522. int       cffgetpos(cfFILE*, long *);
  523. int       cffsetpos(cfFILE*, long *);
  524. cfFILE *cftmpfile(void);
  525. char   *cftmpnam(char *);
  526. char   *cftempnam(char *, char *);
  527. int    cfprintf(const char *fmt, ...);
  528. int    cfeprintf(const char *fmt, ...);
  529. int cfveprintf(const char *fmt, char *args);
  530. int cffprintf(cfFILE *iop, const char *fmt, ...);
  531. int cfsprintf(char *str, const char *fmt, ...);
  532. int cfvprintf(const char *fmt, char *args);
  533. int cfvvprintf(const char *fmt, char **args);
  534. int cfvfprintf(cfFILE *iop, const char *fmt, char *args);
  535. int cfvvfprintf(cfFILE *iop, const char *fmt, char **args);
  536. int cfvsprintf(char *str, const char *fmt, char *args);
  537. int cfvvsprintf(char *str, const char *fmt, char **args);
  538.  
  539. int cfsscanf(char *str, const char *fmt, ...);
  540. int cfvsscanf(char *str, const char *fmt, char **args);
  541. int cffscanf(cfFILE *iop, const char *fmt, ...);
  542. int cfvfscanf(cfFILE *iop, const char *fmt, char **args);
  543. int cfscanf(const char *fmt, ...);
  544. int cfvscanf(const char *fmt, char **args);
  545.  
  546. void cfinit(char *appname, int lbufpages, char *permfile);
  547. void cfexit();
  548. void cfport_settestflags(int flags);
  549.  
  550. void cfhash(const void *keyptr, int keysize, CAT *cat);
  551. long cfrdwr_object(void *handle, void *userbuffer, long amount, int mode);
  552. long cfseek(void *handle, long amount, int mode);
  553.  
  554. int cfkeycmp (void *keya, int lena, void *keyb, int lenb);
  555. int cflexical_keycmp (void *keya, int lena, void *keyb, int lenb);
  556. int cfitemcmp(void *itema, void *itemb);
  557.  
  558. void cfprintbitmaps(void *something);
  559. void cfprintentries(void *something);
  560. void *cfopen(const char *path, long mode, void *info);
  561. void *cfsubopen(void *handle, const char *name, long mode, void *info);
  562. void *cfopen_chunk(void *handle, void *item);
  563. void *cfmake_chunk(void *handle, void *key, int keylen, int size);
  564. void *cfdup(void *handle);
  565. void *cfreopen(void *handle);
  566. void cfclose(void *handle);
  567. int cfunlink(void *something, ... );
  568. int cfstat(void *something, void *stbuf);
  569. int cfsubstat(void *handle,const char *name, void *stbuf);
  570. void *cfcopy(void *something_dst, void *something_src);
  571. long cfcopy_file(void *handle_dst, void *handle_src);
  572. int cfcopy_object(void *handle_dst, void *handle_src);
  573. void cftotalloc(void *something, unsigned long *used, unsigned long *alloc);
  574. long cffilesize(void *something);
  575. void *cflocalize(void *handle, void *item);
  576. void cfrelease(void *ptr, long mode);
  577.  
  578. #define cfread(a,b,c) \
  579. cfrdwr_object(a,b,c,S_READBLK)
  580. #define cfwrite(a,b,c) \
  581. cfrdwr_object(a,b,c,S_WRITEBLK)
  582.  
  583. int cfdef(const char *key, const char *def);
  584. int cfsysdef(const char *key, const char *def);
  585. int cfappdef(const char *key, const char *def);
  586. int cfundef(const char *key);
  587. int cfsysundef(const char *key); 
  588. int cfappundef(const char *key);
  589. int cftrn(const char *strn, char **newstrn);
  590. int cfpathtrn(const char *strn, char **newstrn);
  591. void cfflush(void *handle);
  592. void cfsync(void);
  593. int cftruncate(void *something, unsigned long size);
  594.  
  595. int cfqinsert(void *handle,const void *key, int len, void *item);
  596. int cfinsertx(void *handle,const void *key,int len,void *item,int dups,void *adup);
  597. #define cfinsert(handle,keyptr,keylen,itemptr) \
  598. cfinsertx(handle,keyptr,keylen,itemptr,NODUPS,NULL)
  599. #define cfinsert_dupnum(handle,keyptr,keylen,itemptr,dupnum) \
  600. cfinsertx(handle,keyptr,keylen,itemptr,OKDUPS,dupnum)
  601. #define cfinsert_dupname(handle,keyptr,keylen,itemptr,dupname) \
  602. cfinsertx(handle,keyptr,keylen,itemptr,DUPNAMES,dupname)
  603.  
  604. int cfqget(void *handle, const void *keyptr, int keylen, void *bufptr, int buflen);
  605. int cfqfind(void *handle, const void *keyptr, int keylen, Item *keyi, Item *dati);
  606. int cfqfindkey(void *handle, const void *keyptr, int keylen, Item *keyi);
  607. int cfqfinddat(void *handle, const void *keyptr, int keylen, Item *dati);
  608.  
  609. int cffindx(void *handle, const void *keyptr, int keylen, void *itemptr, void *adup);
  610. #define cffind(handle,key,len,item) \
  611. cffindx(handle,key,len,item,NULL)
  612. #define cffind_dupnum(handle,key,len,item,dupnum) \
  613. cffindx(handle,key,len,item,dupnum)
  614. #define cffind_dupname(handle,dupname,itemptr) \
  615. cffindx(handle,dupname,8,itemptr,(void *)0xffffffff)
  616. #define cfreinsert(handle,key,len,item) \
  617. cffindx(handle,key,-len,item,NULL)
  618. #define cfreinsert_dupnum(handle,key,len,item,dupnum) \
  619. cffindx(handle,key,-len,item,dupnum)
  620. #define cfreinsert_dupname(handle,key,len,itemptr,dupname) \
  621. cffindx(handle,dupname,-8,itemptr,(void *)0xffffffff)
  622.  
  623. int cffind_item(void *handle, const void *key, int keylen, void *itemptr);
  624. int cffind_mark(void *handle, void *itemptr);
  625.  
  626. #define cfdelete(a,b,c) \
  627. cfdelete_item(a,b,c,NULL)
  628. int cfdelete_item(void *handle, void *key, int keylen, void *itemptr);
  629. int cfdelete_dupnum(void *handle, void *key, int keylen, long dupnum);
  630. #define cfdelete_lastdupnum(a,b,c) \
  631. cfdelete_dupnum(a,b,c,-1)
  632. int cfdelete_dupname(void *handle, const void *key, int keylen, void *dupname);
  633. int cfdelete_lastdupname(void *handle, const void *key, int keylen);
  634. int cfdelete_alldupnames(void *handle, const void *key, int keylen);
  635. int cfdelete_alldupnums(void *handle, const void *key, int keylen);
  636. int cflastdupname(void *handle, const void *key, int keylen, void *dupname);
  637.  
  638. long cfpush_item(void *handle, void *itemptr);
  639. long cfpush_value(void *handle, unsigned long *value);
  640. long cfpush_data(void *handle, void *datptr, int datsize);
  641. long cfpop_item(void *handle, void *itemptr);
  642. long cfpop_value(void *handle, unsigned long *value);
  643. long cfpop_data(void *handle, void *datptr, int datsize);
  644. long cfstackdepth(void *handle);
  645.  
  646. long cfcountdups(void *handle, void *key, int keylen);
  647. long cfmisc(void *something, int func, ...);
  648.  
  649. void *cfopendir(const void *path);
  650. void cfclosedir(void *it);
  651. CFDIRENT *cfreaddir(void *it);
  652. CFDIRENT *cfreadfulldir(void *it);
  653. void cfrewinddir(void *it);
  654. void cftelldir(void *it, STOR *entry);
  655. void cfseekdir(void *it, STOR *entry);
  656. long cfentrycnt(void *something);
  657.  
  658. int cfseq_dupnum(void *handle, const void *key, int len, void *itemptr, int mode);
  659. #define cfhead_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_HEAD)
  660. #define cftail_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_TAIL)
  661. #define cfnext_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_NEXT)
  662. #define cfprev_dupnum(a,b,c,d) cfseq_dupnum(a,b,c,d,CF_PREV)
  663.  
  664. int cfseq_dupname(void *handle, void *key, int len, void *itemptr, int mode);
  665. #define cfhead_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_HEAD)
  666. #define cftail_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_TAIL)
  667. #define cfnext_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_NEXT)
  668. #define cfprev_dupname(a,b,c,d) cfseq_dupname(a,b,c,d,CF_PREV)
  669.  
  670.  
  671. #define cfdepth(a) \
  672. cfmisc(a, CF_DEPTH)
  673. #define cfmark(a) \
  674. cfmisc(a, CF_MARK)
  675. #define cfgetmark(a,b) \
  676. cfmisc(a, CF_GETMARK, b)
  677. #define cfsetmark(a,b) \
  678. cfmisc(a, CF_SETMARK, b)
  679. #define cfhead(a,b) \
  680. cfmisc(a, CF_HEAD, b)
  681. #define cftail(a,b) \
  682. cfmisc(a, CF_TAIL, b)
  683. #define cfnext(a,b) \
  684. cfmisc(a, CF_NEXT, b)
  685. #define cfprev(a,b) \
  686. cfmisc(a, CF_PREV, b)
  687. #define cfkeylen(a,b) \
  688. cfmisc(a, CF_KEYLEN, b)
  689. #define cfdatalen(a,b) \
  690. cfmisc(a, CF_DATALEN, b)
  691. #define cfbytesused(a) \
  692. cfmisc(a, CF_USED)
  693. #define cfbytesalloc(a) \
  694. cfmisc(a, CF_ALLOC)
  695. #define cfmodbufs(a) \
  696. cfmisc(NULL, CF_MODBUFS, a)
  697. #define cfcurbufs() \
  698. cfmisc(NULL, CF_CURBUFS)
  699. #define cfsetkeycmp(a,b) \
  700. cfmisc(a, CF_SETKEYCMP, b)
  701. #define cfsetitemcmp(a,b) \
  702. cfmisc(a, CF_SETITEMCMP, b)
  703. #define cfseterrfunc(a) \
  704. cfmisc(NULL, CF_SETERRFUNC, a)
  705. #define cfsetprintfunc(a) \
  706. cfmisc(NULL, CF_SETPRINTFUNC, a)
  707. #define cfisnew(a) \
  708. cfmisc(a,CF_ISNEW)
  709. #define cfsetverylazy(a) \
  710. cfmisc(a, CF_LAZY)
  711. #define cfsetlazy(a) \
  712. cfmisc(a, CF_VERYLAZY)
  713. #define cfclrlazy(a) \
  714. cfmisc(a, CF_CLRLAZY)
  715. #define cffilealloc(a) \
  716. cfmisc(a, CF_FILEALLOC)
  717. #define cfprealloc(a) \
  718. cfmisc(a, CF_PREALLOC)
  719. #define cfalignment(a) \
  720. cfmisc(a, CF_ALIGNMENT)
  721. #define cfmapsize(a) \
  722. cfmisc(a, CF_MAPSIZE)
  723. #define cfissorted(a) \
  724. cfmisc(a, CF_ISSORTED)
  725. #define cfkey(ccb,key,len) \
  726. cfmisc(ccb, CF_KEY, key, len)
  727. #define cfitem(ccb, item) \
  728. cfmisc(ccb, CF_ITEM, item)
  729. #define cfdata(ccb, buf, len) \
  730. cfmisc(ccb, CF_DATA, buf, len)
  731.  
  732. void cfpflags(char *name, void *handle);
  733. long cfobtype(void *handle);
  734. void *cfgetspace(void *handle, long amount, void *addr);
  735. int cfretspace(void *handle, void *addr);
  736.  
  737. void *cfputx(void *handle, const void *keyptr, int keylen, void *itemptr,
  738.                     int dupflg, void *adup, void *bufptr, long buflen);
  739. #define cfput(handle,key,len,buf,buflen,itemptr) \
  740. cfputx(handle,key,len,itemptr,NODUPS,NULL,buf,buflen)
  741. #define cfput_dupnum(handle,key,len,buf,buflen,itemptr,dupnum) \
  742. cfputx(handle,key,len,itemptr,OKDUPS,dupnum,buf,buflen)
  743. #define cfput_dupname(handle,key,len,buf,buflen,itemptr,dupname) \
  744. cfputx(handle,key,len,itemptr,DUPNAMES,dupname,buf,buflen)
  745. #define cfreput(handle,key,len,buf,buflen,itemptr) \
  746. cfputx(handle,key,len,itemptr,NODUPS,NULL,buf,-buflen)
  747. #define cfreput_dupnum(handle,key,len,buf,buflen,itemptr,dupnum) \
  748. cfputx(handle,key,len,itemptr,OKDUPS,dupnum,buf,-buflen)
  749. #define cfreput_dupname(handle,key,len,buf,buflen,itemptr,dupname) \
  750. cfputx(handle,key,len,itemptr,DUPNAMES,dupname,buf,-buflen)
  751.  
  752.  
  753. int cfgetx(void *handle, const void *keyptr, int keylen,
  754.                     void *bufptr, long buflen, void *adup);
  755. #define cfget(handle,key,len,buf,buflen) \
  756. cfgetx(handle,key,len,buf,buflen,NULL)
  757. #define cfget_dupnum(handle,key,len,buf,buflen,dupnum) \
  758. cfgetx(handle,key,len,buf,buflen,dupnum)
  759. #define cfget_dupname(handle,dupname,buf,buflen) \
  760. cfgetx(handle,dupname,8,buf,buflen,(void *)0xffffffff)
  761. int cfchdir(char *);
  762. void cfgetcwd(char *cwd, int size);
  763. int cfdozip(void *, int, void *, int, int);
  764. #define cfzip(dst,dsize,src,ssize)\
  765. cfdozip(dst,dsize,src,ssize,0)
  766. #define cfunzip(dst,dsize,src,ssize)\
  767. cfdozip(dst,dsize,src,ssize,-1)
  768.  
  769.  
  770. void *malloc(SIZE_T);
  771. void free(void *);
  772. unsigned mallocsize(const void *);
  773.  
  774. void *calloc(SIZE_T, SIZE_T);
  775. void *realloc(void *, SIZE_T);
  776. void *memalign(unsigned, unsigned);
  777. void *valloc(unsigned);
  778.  
  779. void *mallocC(long, unsigned);
  780. void *callocC(long, unsigned, unsigned);
  781. void *reallocC(long, void *, unsigned);
  782. void *vallocC(long, unsigned);
  783. void *memalignC(long, unsigned, unsigned);
  784. void freeC(long, void *);
  785. void freecat(long);
  786. void *cfmalloc(unsigned, STOR *);
  787. void cffree(STOR *);
  788. void cfmemrange(long category, unsigned int* min, unsigned int* max);
  789. void cftotrange(unsigned int* min, unsigned int* max);
  790. char *cf_find_file(const char *, char *);
  791. void cf_set_search_path(char *);
  792. char *cf_get_search_path(void);
  793.  
  794. extern unsigned long _oxlink_trace;
  795. int oxlink_init ();
  796. int oxlink_load_file (const char *);
  797. int oxlink_load_object(const char*);
  798. void * oxlink_find_symb (const char *);
  799. void *oxlink_find_bare_symb (const char *);
  800. void *oxlink_find_func (const char *);
  801. void *oxlink_find_bare_func (const char *);
  802. int oxlink_unload_file (const char *name, int force);
  803. int oxlink_unload_symb (const char *name, int force);
  804. int oxlink_unload_bare_symb (const char *name, int force);
  805. char **oxlink_list_undefined_sym (void);
  806. int oxlink_export_symb(const char *name, unsigned addr);
  807. int oxlink_export_bare_symb(const char *name, unsigned addr);
  808. int oxlink_unexport_symb(const char *);
  809. int oxlink_unexport_bare_symb(const char *);
  810. void oxlink_demand_load(void);
  811. void oxlink_use_library(const char *);
  812. void oxlink_nouse_library(const char *);
  813. void  *oxlink_resolve_symb(int symnum);
  814. void oxlink_trace(int level);
  815. char *oxlink_symname(int symnum);
  816. void *oxlink_rename_symb(const char *old, const char *new);
  817. int oxlink_rename_file(const char *old, const char *new);
  818. void *oxlink_load_symb(const char *symb, int dynlink);
  819. void *oxlink_load_bare_symb(const char *symb, int dynlink);
  820. int oxlink_scan_file(void *fhandle, void *thandle);
  821. void oxlink_load_thunk(int thunknum);
  822. int oxlink_prep_thunk(const char *symb);
  823. void oxlink_clear_bss(const char *filename);
  824. char *oxlink_file_of(const char *symb);
  825. char *oxlink_file_of_bare(const char *symb);
  826. void *oxlink_get_entry_struct(const char *filename);
  827.  
  828. void oxlink_lib_check(int dynlink);
  829. void oxlink_set_libtype(int type);
  830. void oxlink_set_libnum(int libnum); 
  831. char *oxlink_errstr(void);
  832.  
  833. int NewMallocCategory();
  834.  
  835. /* PATTERN MATCH FLAGS */
  836. #define P_LEADING_DOT    (0x1)
  837. #define P_IS_PATH        (0x2)
  838. #define P_PAT_PATH        (0x4)
  839. #define P_USES_ESCAPES    (0x8)
  840. #define P_PCDOS            (0x10)
  841.  
  842. int pattern_match (const char *pattern, const char *string, int flags);
  843. int check_for_pattern(const char *cp, int flags);
  844.  
  845. /* CTYPE DEFINITIONS */
  846.    
  847. #ifndef _CTYPE_
  848. #define _CTYPE_
  849.  
  850. #ifndef offsetof
  851. #define offsetof(type, member) ((unsigned) &((type *)0)->member)
  852. #endif
  853.  
  854. #define _mU (0x01)
  855. #define _mL (0x02)
  856. #define _mN (0x04)
  857. #define _mX (0x08)
  858. #define _mS (0x10)
  859. #define _mP (0x20)
  860. #define _mC (0x40)
  861. #define _mB (0x80)
  862.  
  863. extern  unsigned char      cfctype[];
  864.    
  865. #define isalpha(c)  (cfctype[(unsigned char) c]&(_mU|_mL))
  866. #define isupper(c)  (cfctype[(unsigned char) c]&_mU)
  867. #define islower(c)  (cfctype[(unsigned char) c]&_mL)
  868. #define isdigit(c)  (cfctype[(unsigned char) c]&_mN)
  869. #define isxdigit(c) (cfctype[(unsigned char) c]&(_mX|_mN))
  870. #define isspace(c)  (cfctype[(unsigned char) c]&_mS)
  871. #define ispunct(c)  (cfctype[(unsigned char) c]&_mP)
  872. #define isalnum(c)  (cfctype[(unsigned char) c]&(_mU|_mL|_mN))
  873. #define isprint(c)  (cfctype[(unsigned char) c]&(_mP|_mU|_mL|_mN|_mB))
  874. #define isgraph(c)  (cfctype[(unsigned char) c]&(_mP|_mU|_mL|_mN))
  875. #define iscntrl(c)  (cfctype[(unsigned char) c]&_mC)
  876. #define isascii(c)  ((unsigned char)(c)<=(0x7f))
  877.  
  878. #define toupper(c)  ({unsigned char _c = (unsigned char)(c); islower(_c) ? (_c-32) : _c; })
  879. #define tolower(c)  ({unsigned char _c = (unsigned char)(c); isupper(_c) ? (_c+32) : _c; })
  880. #define toascii(c)  ((c)&(0x7f))
  881.  
  882. #endif /* _CTYPE_ */
  883.  
  884. /* COS.H */
  885.  
  886. /* in cossys.o -- returns a 28 bit, very random, number */
  887. unsigned long strHash(char *str, int *len); /* ret length if 'len' nonnull */
  888. unsigned long charHash(char);        /* argument size is assumed 1 */
  889. unsigned long shortHash(short);        /* argument size is assumed 2 */
  890. unsigned long longHash();        /* argument size is assumed 4 */
  891. unsigned long longlongHash();    /* argument size is assumed 8 */
  892.  
  893. /*  object must be declared volatile because if the variable is kept in a
  894.     register, it may not be garbage collected  */
  895.  
  896. typedef void * vobject;        /* methods are defined to return vobject, avoids
  897.                                 gcc 'volatile' bug */
  898. #ifdef KERNEL
  899. typedef    struct    _object     * volatile object;
  900. #else
  901. typedef void * object;
  902. #endif
  903.  
  904. typedef    vobject    (*ofun)();    /* note that functions return 'vobject' */
  905. typedef int (*ifun)();
  906. typedef _LONGLONG_ (*llfun)();
  907.  
  908. void    InitCOS(void *);
  909. ofun    _FindMethod(object, object);        /* used internally only */
  910. ofun    _FindMethod2(object, object, int);    /* error if no find */
  911. ofun    _FindMethod3(object, object, int);    /* return nulfunc if no find */
  912. ofun    FindMethod(object, object, int);    /* return NULL if no find */
  913. vobject    FindMethodObject(object, object, int);
  914. vobject    _jumpToMethod(ofun f);
  915. _LONGLONG_ _callExtern(void *fp, void *sp, void *ap, int ac);
  916. _LONGLONG_ _callExtern1(void *fp, void *sp, void *ap, int ac);
  917. void    *GetIVptr(object, object);
  918. int    IsObj(object);
  919.  
  920. #define TRACE_DONT_CARE        0
  921. #define TRACE_OFF        1
  922. #define TRACE_ON        2
  923. #define TRACE_ALL        3
  924.  
  925.  
  926. #define _cat5_(a, b, c, d, e) a##b##c##d##e
  927. #define _5cat_(a, b, c, d, e) _cat5_(a, b, c, d, e)
  928. #define _cat4_(a, b, c) a##b##c##d
  929. #define _4cat_(a, b, c, d) _cat4_(a, b, c, d)
  930. #define _cat3_(a, b, c) a##b##c
  931. #define _3cat_(a, b, c) _cat3_(a, b, c)
  932. #define    _cat2_(a, b)    a##b
  933. #define _cat_(a, b)    _cat2_(a, b)
  934. #define CLASS_I        _cat_(CLASS, _i)
  935. #define CLASS_C        _cat_(CLASS, _c)
  936. #define CLASS_A        _cat_(CLASS, _a)
  937. #define Generic(x)    _cat_(x, _i)
  938. #define Genericm(x)    _cat_(g, Generic(x))
  939.  
  940. #define _cname2_(x)    #x
  941. #define _cname1_(x)    _cname2_(x)
  942. #define cName        _cname1_(CLASS)
  943.  
  944. #define _im2_(x)    Init##x##Class
  945. #define _im_(x)        _im2_(x)
  946. #define InitMethod    void    _im_(CLASS)
  947.  
  948.  
  949. #define ivType        struct    CLASS_I
  950. #define ivTypedef    typedef struct CLASS_I
  951. #define cvType        struct    CLASS_C
  952. #define cvTypedef    typedef struct CLASS_C
  953. #define instanceVars    ivType
  954. #define classVars    cvType
  955.  
  956. #define ivPtr(x)    ((ivType *) GetIVptr((x), CLASS))
  957. #define cvsPtr        ((cvType *) GetIVptr(CLASS, ClassOf(CLASS)))
  958. #define ivsPtr        ivPtr(self)
  959. #define accessCVs    cvType *cv = cvsPtr
  960. #define accessIVs    ivType *iv = ivsPtr
  961.  
  962. #ifdef KERNEL
  963. #define usesClass(c)    { if (c == NULL) Init##c##Class(); }
  964. #define iMethod(x)    gNew(Method, #x, CLASS, Genericm(x), x)
  965. #define cMethod(x)    gNew(Method, #x, ClassOf(CLASS), Genericm(x), x)
  966. #define iMethodFor(x,y)    gNew(Method, #y, CLASS, Generic(x), y)
  967. #define cMethodFor(x,y)    gNew(Method, #y, ClassOf(CLASS), Generic(x), y)
  968. #else
  969. #define usesClass(c)
  970. #define IMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, CLASS, Genericm(x), x);})
  971. #define CMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, ClassOf(CLASS), Genericm(x), x);})
  972. #define IMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, CLASS, Generic(x), y);})
  973. #define CMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, ClassOf(CLASS), Generic(x), y);})
  974. #define iMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, CLASS, Genericm(x), x);})
  975. #define cMethod(x)    ({extern vobject Genericm(x); gNew(Method, #x, ClassOf(CLASS), Genericm(x), x);})
  976. #define iMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, CLASS, Generic(x), y);})
  977. #define cMethodFor(x,y)    ({extern vobject Generic(x);gNew(Method, #y, ClassOf(CLASS), Generic(x), y);})
  978. #endif
  979.  
  980. #define ivSize        sizeof(instanceVars)
  981. #define cvSize        sizeof(classVars)
  982.  
  983. #define ClassOf(x)    (vobject) *((object *) (x))
  984. #define method        static
  985. #define imethod        method
  986. #define cmethod        method
  987. #define END        (vobject) 0
  988.  
  989. #define IsInstanceOf(i,c)    (ClassOf(i) == (c))
  990. #define IsaMetaClass(x)        (ClassOf(x) == MetaClass)
  991. #define IsaClass(x)        (IsaMetaClass(ClassOf(x)) || IsaMetaClass(x))
  992.  
  993. #define EQ(a,b)        ((a) == (b))
  994. #define NEQ(a,b)    ((a) != (b))
  995.  
  996.  
  997.  
  998. #define tFindMethod(t, c, g, l)  (*(t (*)()) _FindMethod2(c, g, l))
  999.  
  1000. #ifndef KERNEL
  1001. #define super(g)    ({extern vobject Generic(g);(*_FindMethod2(CLASS, Generic(g), 2));})
  1002. #define cSuper(g)    ({extern vobject Generic(g);(*_FindMethod2(ClassOf(CLASS), Generic(g), 2));})
  1003. #define typedSuper(t,g)    ({extern vobject Generic(g);(*tFindMethod(t, ClassOf(self), Generic(g), 2));})
  1004. #define mSuper(g,c) ({extern vobject Generic(g);(*_FindMethod2(c, Generic(g), 2));})
  1005. #define mDirect(g,c) ({extern vobject Generic(g);(*_FindMethod2(c, Generic(g), 1));})
  1006. #define mSuperNoError(g,c) ({extern vobject Generic(g);(*_FindMethod3(c, Generic(g), 2));})
  1007. #define mDirectNoError(g,c) ({extern vobject Generic(g);(*_FindMethod3(c, Generic(g), 1));})
  1008.  
  1009.  
  1010. /* get instance method from a class object */
  1011. #define imcPointer(c,g)  (ofun)({extern vobject Generic(g);gFindMethod(c, Generic(g), 1);})
  1012. /* get class method from a class object */
  1013. #define cmcPointer(c,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(c), Generic(g), 1);})
  1014. /* get instance method from an instance object */
  1015. #define imiPointer(i,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(i), Generic(g), 1);})
  1016. /* get class method from an instance object */
  1017. #define cmiPointer(i,g)  (ofun)({extern vobject Generic(g);gFindMethod(ClassOf(ClassOf(i)), Generic(g), 1);})
  1018. #define RespondsTo(i,g)    (ofun)({extern vobject Generic(g);(gFindMethod(ClassOf(i), Generic(g), 1) != NULL);})
  1019.  
  1020. extern object Class;
  1021. extern object Method;
  1022. extern object COS;
  1023. extern vobject gNew(object, ...);
  1024. extern vobject gDispose(object);
  1025. extern ofun gFindMethod();
  1026. extern vobject LoadClass(void *);
  1027.  
  1028. #else /* KERNEL */
  1029. #define super(g)    (*_FindMethod2(CLASS, Generic(g), 2))
  1030. #define cSuper(g)    (*_FindMethod2(ClassOf(CLASS), Generic(g), 2))
  1031. #define typedSuper(t,g)    (*tFindMethod(t, ClassOf(self), Generic(g), 2))
  1032. /* get instance method from a class object */
  1033. #define imcPointer(c,g)  gFindMethod(c, Generic(g), 1)
  1034. /* get class method from a class object */
  1035. #define cmcPointer(c,g)  gFindMethod(ClassOf(c), Generic(g), 1)
  1036. /* get instance method from an instance object */
  1037. #define imiPointer(i,g)  gFindMethod(ClassOf(i), Generic(g), 1)
  1038. /* get class method from an instance object */
  1039. #define cmiPointer(i,g)  gFindMethod(ClassOf(ClassOf(i)), Generic(g), 1)
  1040. #define RespondsTo(i,g)    (gFindMethod(ClassOf(i), Generic(g), 1) != NULL)
  1041. #define mDirect(g,c) (*_FindMethod2(c, Generic(g), 1))
  1042. #endif /* KERNEL */
  1043.  
  1044. #define typedGeneric(t,g)     (*(t (*)()) &g)
  1045.  
  1046.  
  1047. #define RegisterVariable(v)    gRegisterMemory(COS, &v, (long) sizeof(object))
  1048.  
  1049. #define makeThenAccess(self, obj, iv)          \
  1050.     object    obj = cSuper(gNew)(self);    \
  1051.     ivType    *iv = ivPtr(obj)
  1052.  
  1053. extern    int    _CheckObjects_;
  1054. extern    object    _LastGeneric_;        /*  last generic called  */
  1055.  
  1056. #define ChkArg(obj, argn)                        \
  1057.     if (_CheckObjects_  &&  !IsObj(obj))                \
  1058.         gInvalidObject(_LastGeneric_, argn, self)
  1059.  
  1060. #define ChkArgTyp(obj, argn, argType)                    \
  1061.     if (_CheckObjects_)  {                        \
  1062.         if (!IsObj(obj))                    \
  1063.             gInvalidObject(_LastGeneric_, argn, self);    \
  1064.         if (argType)  {                        \
  1065.             object    lg = _LastGeneric_;            \
  1066.             if (!gIsKindOf(obj, argType))            \
  1067.                 gInvalidType(lg, argn, self, argType, obj); \
  1068.             _LastGeneric_ = lg;                \
  1069.         }                            \
  1070.     }
  1071.  
  1072. #define ChkArgNul(obj, argn)           if (obj)  ChkArg(obj, argn)
  1073.  
  1074. #define ChkArgTypNul(obj, argn, argType)     \
  1075.     if (obj)  ChkArgTyp(obj, argn, argType)
  1076.  
  1077. #define CheckArg(obj, argn, argType)                    \
  1078.     if (_CheckObjects_)  {                        \
  1079.         if (!IsObj(obj))                    \
  1080.             gInvalidObject(_LastGeneric_, argn, self);    \
  1081.         if (argType)  {                        \
  1082.             object    lg = _LastGeneric_;            \
  1083.             if (!gIsKindOf(obj, argType))            \
  1084.                 gInvalidType(lg, argn, self, argType, obj); \
  1085.             _LastGeneric_ = lg;                \
  1086.         }                            \
  1087.     }
  1088.  
  1089.  
  1090. /*  Thread stuff  */
  1091.  
  1092.  
  1093. /*  thread states   */
  1094.  
  1095. #define NEW_THREAD            (0)
  1096. #define    RUNNING_THREAD        (1)
  1097. #define HOLD_THREAD            (2)
  1098. #define DONE_THREAD            (3)
  1099. #define EXPUNGE_THREAD        (4)
  1100. #define WAITING_FOR_THREAD    (5)
  1101. #define WAITING_FOR_SEMAPHORE    (6)
  1102.  
  1103. #define DEFAULT_PRIORITY    100
  1104.  
  1105. #define TIMESTAMP (OXPORT_timestamp())
  1106. #define THREAD_COUNTDOWN (OXPORT_thread_countdown())
  1107. #define THREAD_MSEC (oxport_thread_msec)
  1108. #define MSEC_PER_TICK (55)
  1109. #define DEFAULT_THREAD_MSEC MSEC_PER_TICK
  1110.  
  1111. extern    unsigned long    _final_thread_tick;
  1112. extern    int    _no_context_switch;
  1113. extern    jmp_buf    _t_start;
  1114.  
  1115. extern    void    (*__cos_yield)();
  1116. extern    void    _start_threader(), _start_thread();
  1117.  
  1118. #define INHIBIT_THREADER    _no_context_switch++
  1119. #define ENABLE_THREADER        if (_no_context_switch) _no_context_switch--
  1120.  
  1121. #if 0  /*  Debugging or to disable Threads  */
  1122. #define YIELD    
  1123. #else
  1124. #define YIELD    ({if (!_no_context_switch){if(THREAD_COUNTDOWN){(*__cos_yield)(0);}}})
  1125. #endif
  1126.  
  1127. #define StartThreader(x)        \
  1128.     _start_threader(&x);        \
  1129.     if (setjmp(_t_start))        \
  1130.         _start_thread()
  1131.  
  1132.  
  1133. /*  End of thread specific stuff  */
  1134.  
  1135. /* Message dispatch */
  1136. #define __CFWNDCLASS_ID__ 0xd24f193c
  1137. #define __CFMSGCLASS_ID__ 0x87104be5
  1138.  
  1139. typedef struct __mdis__ {
  1140.     long id;
  1141.     _LONGLONG_ (*defproc)();
  1142.     _LONGLONG_ (*usrproc)();
  1143. } *MD, MDIV;
  1144.  
  1145. #define ClassMsgProc(cl) \
  1146. ({MD biv=GetIVptr(self,cl);(*biv->defproc)(self,wnd,it);})
  1147.  
  1148. #define DefaultMsgProc() \
  1149. ({MD biv=GetIVptr(self,ClassOf(self));(*biv->defproc)(self,wnd,it);})
  1150.  
  1151. #define Mfunc(a) _5cat_(CLASS,_,MPROC,_,a)
  1152.  
  1153. #if 0
  1154. #define MsgFunc(a) _LONGLONG_ Mfunc(a)(object self,WINDOW wnd,CFmsg it,CLASS_I *iv,CLASS_C *cv)
  1155. #else
  1156. #define MsgFunc(a) _LONGLONG_ Mfunc(a)(MSGARGS *args)
  1157. #endif
  1158.  
  1159. typedef struct msgbitstuf {
  1160. void *cmdDict;
  1161. vobject bitVec;
  1162. int (*bitTest)();    
  1163. } MSGBITSTUF;
  1164.  
  1165. #define MSGARGS CLASS_A
  1166.  
  1167. #define MSGARGDEF \
  1168. typedef struct CLASS_A { \
  1169.     vobject self; \
  1170.     struct window  *wnd; \
  1171.     CFmsg it; \
  1172.     CLASS_I *iv; \
  1173.     CLASS_C *cv; \
  1174.     MSGBITSTUF bs; \
  1175.     char *fn; \
  1176. } CLASS_A;
  1177.  
  1178. #define TO_SUPERCLASS (0x7a6b290cf31e4811LL)
  1179.  
  1180. #define CLASSMSG(args...) \
  1181. ({\
  1182. extern _LONGLONG_ MASTERdomsg();\
  1183. static MSGARGS margs = {fn: "_" cName "_" __FUNCTION__ "_"};\
  1184. _LONGLONG_ result; \
  1185. if(it.e_type == evAddCmd) {\
  1186. if(margs.bs.bitVec)\
  1187.   if(margs.bs.bitTest(margs.bs.bitVec, it.M_LPARAM))\
  1188.     gReset(margs.bs.bitVec, it.M_LPARAM);\
  1189.   result = 0;\
  1190. }else {\
  1191. margs.cv = cvsPtr;\
  1192. margs.iv = ivsPtr;\
  1193. margs.it = it;\
  1194. margs.wnd = wnd;\
  1195. margs.self = self;\
  1196. result = MASTERdomsg(&margs , ## args);\
  1197. }\
  1198. result;})
  1199.  
  1200. #if 0
  1201. #define defGeneric(t, g)                       \
  1202.     object    Generic(g) = (vobject) 0;            \
  1203.     t    g(object i, ...)            \
  1204.         {                            \
  1205.         if (_CheckObjects_)  {                \
  1206.             if (!IsObj(i))                \
  1207.                 gInvalidObject(Generic(g), 1, i);  \
  1208.             _LastGeneric_ = Generic(g);        \
  1209.         }                        \
  1210.         YIELD;                        \
  1211.         _jumpToMethod( _FindMethod(ClassOf(i), Generic(g), 1) ); \
  1212.     }
  1213. #else
  1214. #define defGeneric(t, g)                       \
  1215.     object    Generic(g) = (object) 0;            \
  1216.     t    g(object i, ...)            \
  1217.     {                            \
  1218.         _jumpToMethod( _FindMethod(i, Generic(g)) );     \
  1219.     }
  1220. #endif
  1221.  
  1222. #define externGeneric(t, g)                    \
  1223.     extern    object    Generic(g);                \
  1224.     extern    t    g(object i, ...);
  1225.  
  1226. #define InitGeneric(x)    Generic(x) = gNew(GenericFunction, #x)
  1227.  
  1228. #define _qt2_(x) #x
  1229. #define _qt_(x) _qt2_(x)
  1230.  
  1231. #define oxcall(func, args...) ({ \
  1232. typedef _fret = (func()); \
  1233. _fret (*dofunc)(); _fret _ret; \
  1234. dofunc = oxlink_find_bare_func(_qt_(_cat_(_, func))); \
  1235. if(!dofunc) \
  1236. dofunc = oxlink_load_bare_symb(_qt_(_cat_(_, func)),1); \
  1237. else oxlink_clear_bss(oxlink_file_of_bare(_qt_(_cat_(_, func))));\
  1238. if(dofunc) _ret = dofunc(## args); \
  1239. else _ret = (_fret) -1; \
  1240. _ret;})
  1241.  
  1242.  
  1243. #define oxrun(func, args...) ({ \
  1244. typedef _fret = (func()); \
  1245. _fret (*dofunc)(); _fret _ret; \
  1246. dofunc = oxlink_find_bare_func(_qt_(_cat_(_, func))); \
  1247. if(!dofunc) \
  1248. dofunc = oxlink_load_bare_symb(_qt_(_cat_(_, func)),1); \
  1249. if(dofunc) { _ret = dofunc(## args);gGC(COS);oxlink_unload_symb(#func, 0); } \
  1250. else _ret = (_fret) -1; \
  1251. _ret;})
  1252.  
  1253. #define oxfunc(func, args...) ({ \
  1254. typedef _fret = (appfunc()); \
  1255. _fret (*dofunc)(); _fret _ret; \
  1256. dofunc = oxlink_load_bare_symb(func,1); \
  1257. if(dofunc) _ret = dofunc(## args); \
  1258. else _ret = (_fret) -1; \
  1259. _ret;})
  1260.  
  1261. #define oxload_bare(func) \
  1262. oxlink_load_bare_symb(_qt_(_cat_(_, func)),1)
  1263.  
  1264. #define oxload(func) \
  1265. oxlink_load_symb(#func,1)
  1266.  
  1267. #define oxunload(func) \
  1268. oxlink_unload_symb(#func, 0)
  1269.  
  1270.  
  1271. #define DISPATCH_MESSAGES \
  1272. ({extern vobject Thread; vobject _th = (vobject)gFind(Thread, NULL); \
  1273. while(DispatchMessages(_th));})
  1274.  
  1275. #define INIT_IO(arg) \
  1276. ({_LONGLONG_ AppMsg();CF_InitIO(arg, AppMsg); \
  1277. if((arg & (CF_USE_MESSAGES|CF_USE_EVENTS)) && !(arg & CF_USE_GUI)) { \
  1278. extern object Absorber; \
  1279. extern object Application; \
  1280. vobject pgm = gNew(Absorber, AppMsg); \
  1281. Application = Absorber; \
  1282. CaptureKeyboard(pgm, 0);}})
  1283.  
  1284. extern void *_cos_malloc(unsigned);
  1285. extern void *_cos_calloc(unsigned, unsigned);
  1286. extern void *_cos_realloc(void *, unsigned);
  1287. #define     Talloc(t)   (t *) _cos_malloc(sizeof(t))
  1288. #define     Tcalloc(t)  (t *) _cos_calloc(1, sizeof(t))
  1289. #define     Tnalloc(t,n)   (t *) _cos_malloc((n) * sizeof(t))
  1290. #define     Tncalloc(t,n)  (t *) _cos_calloc((n), sizeof(t))
  1291. #define  Tnrealloc(t,n,b) (t *) _cos_realloc(b, (n) * sizeof(t))
  1292.  
  1293. #ifdef KERNEL
  1294. #include <generics.h>
  1295. #endif /* KERNEL */
  1296.  
  1297. /*  from the Stream class  */
  1298. extern    object    stdoutStream, stdinStream, stderrStream;
  1299. extern    object    traceStream;
  1300.  
  1301. void    *MA_malloc(unsigned, void *);
  1302. void    MA_free(void *);
  1303. void    *MA_realloc(void *, unsigned);
  1304. void    MA_compact(void);
  1305. void    *MA_calloc(unsigned, void *);
  1306.  
  1307. #define     MTncalloc(t,n,v)  (t *) MA_calloc((n) * sizeof(t), &v)
  1308. #define     MTnalloc(t,n,v)   (t *) MA_malloc((n) * sizeof(t), &v)
  1309.  
  1310. /* KEYCODES */
  1311. /* ----------- keys ------------ */
  1312.  
  1313. /* 
  1314.     This file defines all extended keys which can be read from DOS in
  1315.     raw unfiltered mode with CTRL BREAK checking turned off. i.e.
  1316.     the first character read is == 0 and the second character contains
  1317.     a scan code. Here we create a 2 byte character with the scan code
  1318.     in the low order byte and a flag bit in the high order byte.
  1319.     
  1320.     Non printable characters created by typing the CTRL key are also
  1321.     defined here.
  1322. */
  1323. /* 
  1324.     Believe it or not, gcc 2.2.2 has a bug which causes parsing to fail
  1325.     if a hex constant ends in E or e. So you will see decimal values
  1326.     occasionally. [NDC]
  1327. */
  1328. #define EFLAG         (0x0100)
  1329. #define SHIFTFLAG    (0x0200)
  1330. #define ALTFLAG        (0x0400)
  1331. #define CTRLFLAG    (0x0800)
  1332.  
  1333. #define CTL_AT    (0x0)
  1334. #define NUL        (0x0)
  1335. #define CTL_A    (0x1)
  1336. #define SOH        (0x1) 
  1337. #define CTL_B    (0x2)
  1338. #define STX        (0x2)
  1339. #define CTL_C    (0x3)
  1340. #define ETX        (0x3)
  1341. #define CTL_D    (0x4)
  1342. #define EOT        (0x4)
  1343. #define CTL_E    (0x5)
  1344. #define ENQ        (0x5)
  1345. #define CTL_F    (0x6)
  1346. #define ACK        (0x6)
  1347. #define CTL_G    (0x7)
  1348. #define BELL    (0x7)
  1349. #define CTL_H    (0x8)
  1350. #define RUBOUT    (0x8)
  1351. #define BS        (0x8)
  1352. #define CTL_I    (0x9)
  1353. #define HT        (0x9)
  1354. #define TAB        (0x9)
  1355. #define CTL_J    (0xA)
  1356. #define LF        (0xA)
  1357. #define CTL_K    (0xB)
  1358. #define VT        (0xB)
  1359. #define CTL_L    (0xC)
  1360. #define FF        (0xC)
  1361. #define CTL_M    (0xD)
  1362. #define CR        (0xD)
  1363. #define ENTER    (0xD)
  1364. #define CTL_N    (6)
  1365. #define SO        (6)
  1366. #define CTL_O    (0xF)
  1367. #define SI        (0xF)
  1368. #define CTL_P    (0x10)
  1369. #define DLE        (0x10)
  1370. #define CTL_Q    (0x11)
  1371. #define DC1        (0x11)
  1372. #define CTL_R    (0x12)
  1373. #define DC2        (0x12)
  1374. #define CTL_S    (0x13)
  1375. #define DC3        (0x13)
  1376. #define CTL_T    (0x14)
  1377. #define DC4        (0x14)
  1378. #define CTL_U    (0x15)
  1379. #define NAK        (0x15)
  1380. #define CTL_V    (0x16)
  1381. #define SYN        (0x16)
  1382. #define CTL_W    (0x17)
  1383. #define ETB        (0x17)
  1384. #define CTL_X    (0x18)
  1385. #define CAN        (0x18)
  1386. #define CTL_Y    (0x19)
  1387. #define EM        (0x19)
  1388. #define CTL_Z    (0x1A)
  1389. #define SUB        (0x1A)
  1390. #define CTL_LBRK    (0x1B)
  1391. #define ESCKEY        (0x1B)
  1392. #define CTL_BKSLSH    (0x1C)
  1393. #define FS            (0x1C)
  1394. #define CTL_RBRK    (0x1D)
  1395. #define GS            (0x1D)
  1396. #define CTL_CARAT    (30) 
  1397. #define RS            (30)
  1398. #define CTL_HYPHEN    (0x1F)
  1399. #define US            (0x1F)
  1400. #define CTL_BS        (0x7F)
  1401. #define ASCIDEL        (0x7F)
  1402. #define SLASHKEY     ('/')
  1403. #define SPACEKEY     (' ')
  1404.  
  1405. #define F1            (0x3B+EFLAG)
  1406. #define F2            (0x3C+EFLAG)
  1407. #define F3            (0x3D+EFLAG)
  1408. #define F4            (62+EFLAG)
  1409. #define F5            (0x3F+EFLAG)
  1410. #define F6            (0x40+EFLAG)
  1411. #define F7            (0x41+EFLAG)
  1412. #define F8            (0x42+EFLAG)
  1413. #define F9            (0x43+EFLAG)
  1414. #define F10            (0x44+EFLAG)
  1415. #define F11            (0x85+EFLAG)
  1416. #define F12            (0x86+EFLAG)
  1417. #define SHIFT_F1    (0x54+EFLAG)
  1418. #define SHIFT_F2    (0x55+EFLAG)
  1419. #define SHIFT_F3    (0x56+EFLAG)
  1420. #define SHIFT_F4    (0x57+EFLAG)
  1421. #define SHIFT_F5    (0x58+EFLAG)
  1422. #define SHIFT_F6    (0x59+EFLAG)
  1423. #define SHIFT_F7    (0x5A+EFLAG)
  1424. #define SHIFT_F8    (0x5B+EFLAG)
  1425. #define SHIFT_F9    (0x5C+EFLAG)
  1426. #define SHIFT_F10    (0x5D+EFLAG)
  1427. #define SHIFT_F11    (0x87+EFLAG)
  1428. #define SHIFT_F12    (0x88+EFLAG)
  1429. #define CTRL_F1        (94+EFLAG)
  1430. #define CTRL_F2     (0x5F+EFLAG)
  1431. #define CTRL_F3     (0x60+EFLAG)
  1432. #define CTRL_F4     (0x61+EFLAG)
  1433. #define CTRL_F5     (0x62+EFLAG)
  1434. #define CTRL_F6     (0x63+EFLAG)
  1435. #define CTRL_F7     (0x64+EFLAG)
  1436. #define CTRL_F8     (0x65+EFLAG)
  1437. #define CTRL_F9     (0x66+EFLAG)
  1438. #define CTRL_F10    (0x67+EFLAG)
  1439. #define CTRL_F11    (0x89+EFLAG)
  1440. #define CTRL_F12    (0x8A+EFLAG)
  1441. #define ALT_F1      (0x68+EFLAG)
  1442. #define ALT_F2      (0x69+EFLAG)
  1443. #define ALT_F3      (0x6A+EFLAG)
  1444. #define ALT_F4      (0x6B+EFLAG)
  1445. #define ALT_F5      (0x6C+EFLAG)
  1446. #define ALT_F6      (0x6D+EFLAG)
  1447. #define ALT_F7        (110+EFLAG)
  1448. #define ALT_F8      (0x6F+EFLAG)
  1449. #define ALT_F9      (0x70+EFLAG)
  1450. #define ALT_F10     (0x71+EFLAG)
  1451. #define ALT_F11     (0x8B+EFLAG)
  1452. #define ALT_F12     (0x8C+EFLAG)
  1453.  
  1454. #define HOMEKEY        (0x47+EFLAG)
  1455. #define UPKEY        (0x48+EFLAG)
  1456. #define PGUP        (0x49+EFLAG)
  1457. #define BAKKEY        (0x4B+EFLAG)
  1458. #define FWDKEY        (0x4D+EFLAG)
  1459.  
  1460. #define ENDKEY        (0x4F+EFLAG)
  1461. #define DNKEY        (0x50+EFLAG)
  1462. #define PGDN        (0x51+EFLAG)
  1463. #define INSERTKEY    (0x52+EFLAG)
  1464. #define DELETEKEY    (0x53+EFLAG)
  1465.  
  1466. #define CTRL_HOME    (0x77+EFLAG)
  1467. #define CTRL_UP        (0x8D+EFLAG)
  1468. #define CTRL_PGUP    (0x84+EFLAG)
  1469. #define CTRL_BAK    (0x73+EFLAG)
  1470. #define CTRL_FWD    (0x74+EFLAG)
  1471. #define CTRL_END    (0x75+EFLAG)
  1472. #define CTRL_DN        (0x91+EFLAG)
  1473. #define CTRL_PGDN    (0x76+EFLAG)
  1474. #define CTRL_INSERT    (0x92+EFLAG)
  1475. #define CTRL_DELETE    (0x93+EFLAG)
  1476. #define CTRL_HT        (0x94+EFLAG)
  1477. #define CTRL_TAB    CTRL_HT
  1478. #define CTRL_2        (0x03+EFLAG)
  1479.  
  1480. /* keypad keys */
  1481. #define KP_FIVE            (0x4c+EFLAG)
  1482. #define CTRL_KP_SLASH    (0x95+EFLAG)
  1483. #define CTRL_KP_STAR    (0x96+EFLAG)
  1484. #define CTRL_KP_PLUS    (0x90+EFLAG)
  1485. #define CTRL_KP_MINUS    (142+EFLAG)
  1486. #define CTRL_KP_FIVE    (0x8F+EFLAG)
  1487.  
  1488. /* *** GRAY CENTER KEYS ONLY *** */
  1489. #define ALT_HOME    (0x97+EFLAG)
  1490. #define ALT_UP        (0x98+EFLAG)
  1491. #define ALT_PGUP    (0x99+EFLAG)
  1492. #define ALT_BAK        (0x9B+EFLAG)
  1493. #define ALT_FWD        (0x9D+EFLAG)
  1494. #define ALT_END        (0x9F+EFLAG)
  1495. #define ALT_DN        (0xA0+EFLAG)
  1496. #define ALT_PGDN    (0xA1+EFLAG)
  1497. #define ALT_INSERT    (0xA2+EFLAG)
  1498. #define ALT_DELETE    (0xA3+EFLAG)
  1499. /* ****************************** */
  1500.  
  1501. #define ALT_A        (30+EFLAG)
  1502. #define ALT_B        (0x30+EFLAG)
  1503. #define ALT_C        (46+EFLAG)
  1504. #define ALT_D        (0x20+EFLAG)
  1505. #define ALT_E        (0x12+EFLAG)
  1506. #define ALT_F        (0x21+EFLAG)
  1507. #define ALT_G        (0x22+EFLAG)
  1508. #define ALT_H        (0x23+EFLAG)
  1509. #define ALT_I        (0x17+EFLAG)
  1510. #define ALT_J        (0x24+EFLAG)
  1511. #define ALT_K        (0x25+EFLAG)
  1512. #define ALT_L        (0x26+EFLAG)
  1513. #define ALT_M        (0x32+EFLAG)
  1514. #define ALT_N        (0x31+EFLAG)
  1515. #define ALT_O        (0x18+EFLAG)
  1516. #define ALT_P        (0x19+EFLAG)
  1517. #define ALT_Q        (0x10+EFLAG)
  1518. #define ALT_R        (0x13+EFLAG)
  1519. #define ALT_S        (0x1F+EFLAG)
  1520. #define ALT_T        (0x14+EFLAG)
  1521. #define ALT_U        (0x16+EFLAG)
  1522. #define ALT_V        (0x2F+EFLAG)
  1523. #define ALT_W        (0x11+EFLAG)
  1524. #define ALT_X        (0x2D+EFLAG)
  1525. #define ALT_Y        (0x15+EFLAG)
  1526. #define ALT_Z        (0x2C+EFLAG)
  1527. #define ALT_1        (0x78+EFLAG)
  1528. #define ALT_2        (0x79+EFLAG)
  1529. #define ALT_3        (0x7A+EFLAG)
  1530. #define ALT_4        (0x7B+EFLAG)
  1531. #define ALT_5        (0x7C+EFLAG)
  1532. #define ALT_6        (0x7D+EFLAG)
  1533. #define ALT_7        (126+EFLAG)
  1534. #define ALT_8        (0x7F+EFLAG)
  1535. #define ALT_9        (0x80+EFLAG)
  1536. #define ALT_0        (0x81+EFLAG)
  1537. #define ALT_HYPHEN    (0x82+EFLAG)
  1538. #define ALT_EQUALS    (0x83+EFLAG)
  1539. #define ALT_LBRK    (0x1A+EFLAG)
  1540. #define ALT_RBRK    (0x1B+EFLAG)
  1541. #define ALT_SEMI    (0x27+EFLAG)
  1542. #define ALT_RAPOS    (0x28+EFLAG)
  1543. #define ALT_LAPOS    (0x29+EFLAG)
  1544. #define ALT_BKSLSH    (0x2B+EFLAG)
  1545. #define ALT_COMMA    (0x33+EFLAG)
  1546. #define ALT_PERIOD    (0x34+EFLAG)
  1547. #define ALT_SLASH    (0x35+EFLAG)
  1548. #define ALT_BS        (6+EFLAG)
  1549. #define ALT_ENTER    (0x1C+EFLAG)
  1550. #define ALT_HT        (0xA5+EFLAG)
  1551. #define ALT_TAB        ALT_HT
  1552. #define ALT_ESC        (0x01+EFLAG)
  1553.  
  1554. /* keypad keys */
  1555. #define ALT_KP_ENTER    (0xA6+EFLAG)
  1556. #define ALT_KP_PLUS        (78+EFLAG)
  1557. #define ALT_KP_MINUS    (0x4A+EFLAG)
  1558. #define ALT_KP_STAR        (0x37+EFLAG)
  1559. #define ALT_KP_SLASH    (0xA4+EFLAG)
  1560.  
  1561. #define SHIFT_HT        (0x0F+EFLAG)
  1562. #define SHIFT_TAB         SHIFT_HT
  1563. /* 
  1564.     Artificial codes produced by testing the shift states
  1565.  
  1566.     Unused codes:
  1567.     02,04,05,06,07,08,09,0A,0B,0C,0D,2A,36,38,39,3A,45,46,
  1568.     72,9A,A7-AF,BC-BF,C0-CF,E0-EF,F0-FF
  1569. */
  1570.  
  1571. #define SHIFT_INSERT        (INSERTKEY+SHIFTFLAG)
  1572. #define SHIFT_END            (ENDKEY+SHIFTFLAG)
  1573. #define SHIFT_DN            (DNKEY+SHIFTFLAG)
  1574. #define SHIFT_PGDN            (PGDN+SHIFTFLAG)
  1575. #define SHIFT_BAK            (BAKKEY+SHIFTFLAG)
  1576. #define SHIFT_KP_FIVE        (KP_FIVE+SHIFTFLAG)
  1577. #define SHIFT_FWD            (FWDKEY+SHIFTFLAG)
  1578. #define SHIFT_HOME            (HOMEKEY+SHIFTFLAG)
  1579. #define SHIFT_UP            (UPKEY+SHIFTFLAG)
  1580. #define SHIFT_PGUP            (PGUP+SHIFTFLAG)
  1581. #define SHIFT_DELETE        (DELETEKEY+SHIFTFLAG)
  1582.  
  1583. #define SHIFT_CTRL_INSERT    (CTRL_INSERT+SHIFTFLAG)
  1584. #define SHIFT_CTRL_END        (CTRL_END+SHIFTFLAG)
  1585. #define SHIFT_CTRL_DN        (CTRL_DN+SHIFTFLAG)
  1586. #define SHIFT_CTRL_PGDN        (CTRL_PGDN+SHIFTFLAG)
  1587. #define SHIFT_CTRL_BAK        (CTRL_BAK+SHIFTFLAG)
  1588. #define SHIFT_CTRL_KP_FIVE    (CTRL_KP_FIVE+SHIFTFLAG)
  1589. #define SHIFT_CTRL_FWD        (CTRL_FWD+SHIFTFLAG)
  1590. #define SHIFT_CTRL_HOME        (CTRL_HOME+SHIFTFLAG)
  1591. #define SHIFT_CTRL_UP        (CTRL_UP+SHIFTFLAG)
  1592. #define SHIFT_CTRL_PGUP        (CTRL_PGUP+SHIFTFLAG)
  1593. #define SHIFT_CTRL_DELETE    (CTRL_DELETE+SHIFTFLAG)
  1594.  
  1595. #define SHIFT_ALT_INSERT    (ALT_INSERT+SHIFTFLAG)
  1596. #define SHIFT_ALT_END        (ALT_END+SHIFTFLAG)
  1597. #define SHIFT_ALT_DN        (ALT_DN+SHIFTFLAG)
  1598. #define SHIFT_ALT_PGDN        (ALT_PGDN+SHIFTFLAG)
  1599. #define SHIFT_ALT_BAK        (ALT_BAK+SHIFTFLAG)
  1600. #define SHIFT_ALT_FWD        (ALT_FWD+SHIFTFLAG)
  1601. #define SHIFT_ALT_HOME        (ALT_HOME+SHIFTFLAG)
  1602. #define SHIFT_ALT_UP        (ALT_UP+SHIFTFLAG)
  1603. #define SHIFT_ALT_PGUP        (ALT_PGUP+SHIFTFLAG)
  1604. #define SHIFT_ALT_DELETE    (ALT_DELETE+SHIFTFLAG)
  1605.  
  1606. #define CTRL_ALT_INSERT        (ALT_INSERT+CTRLFLAG)
  1607. #define CTRL_ALT_END        (ALT_END+CTRLFLAG)
  1608. #define CTRL_ALT_DN            (ALT_DN+CTRLFLAG)
  1609. #define CTRL_ALT_PGDN        (ALT_PGDN+CTRLFLAG)
  1610. #define CTRL_ALT_BAK        (ALT_BAK+CTRLFLAG)
  1611. #define CTRL_ALT_FWD        (ALT_FWD+CTRLFLAG)
  1612. #define CTRL_ALT_HOME        (ALT_HOME+CTRLFLAG)
  1613. #define CTRL_ALT_UP            (ALT_UP+CTRLFLAG)
  1614. #define CTRL_ALT_PGUP        (ALT_PGUP+CTRLFLAG)
  1615. #define CTRL_ALT_DELETE        (ALT_DELETE+CTRLFLAG)
  1616.  
  1617. #define SHIFT_CTRL_KP_SLASH    (CTRL_KP_SLASH+SHIFTFLAG)
  1618. #define SHIFT_CTRL_KP_STAR    (CTRL_KP_STAR+SHIFTFLAG)
  1619. #define SHIFT_CTRL_KP_MINUS    (CTRL_KP_MINUS+SHIFTFLAG)
  1620. #define SHIFT_CTRL_KP_PLUS    (CTRL_KP_PLUS+SHIFTFLAG)
  1621. #define SHIFT_ALT_KP_ENTER    (ALT_KP_ENTER+SHIFTFLAG)
  1622. #define CTRL_ALT_KP_ENTER    (ALT_KP_ENTER+CTRLFLAG)
  1623. #define CTRL_ALT_KP_PLUS    (ALT_KP_PLUS+CTRLFLAG)
  1624. #define CTRL_ALT_KP_MINUS    (ALT_KP_MINUS+CTRLFLAG)
  1625. #define CTRL_ALT_KP_STAR    (ALT_KP_STAR+CTRLFLAG)
  1626. #define CTRL_ALT_KP_SLASH    (ALT_KP_SLASH+CTRLFLAG)
  1627.  
  1628.  
  1629. #define SHIFT_CTRL_BS        (CTL_BS+SHIFTFLAG)
  1630. #define SHIFT_ALT_BS        (ALT_BS+SHIFTFLAG)
  1631. #define SHIFT_CTRL_HT        (CTRL_HT+SHIFTFLAG)
  1632. #define SHIFT_CTRL_TAB        SHIFT_CTRL_HT
  1633. #define SHIFT_ALT_HT        (ALT_HT+SHIFTFLAG)
  1634. #define SHIFT_ALT_TAB        SHIFT_ALT_HT
  1635.  
  1636. #define CTRL_ALT_BS            (ALT_BS+CTRLFLAG)
  1637. #define CTRL_SLASH            (SLASHKEY+CTRLFLAG)
  1638. #define CTRL_ESC            (ESCKEY+CTRLFLAG)
  1639. #define CTRL_SPACE            (SPACEKEY+CTRLFLAG)
  1640. #define SHIFT_ESC            (ESCKEY+SHIFTFLAG)
  1641. #define ALT_SPACE            (SPACEKEY+ALTFLAG)
  1642.  
  1643. /* keypad specials (not usually implemented) */
  1644. #define KP_ENTER            (0xB0+EFLAG)
  1645. #define KP_PLUS                (0xB1+EFLAG)
  1646. #define KP_MINUS            (0xB2+EFLAG)
  1647. #define KP_STAR                (0xB3+EFLAG)
  1648. #define KP_SLASH            (0xB4+EFLAG)
  1649. #define SHIFT_KP_ENTER        (0xB5+EFLAG)
  1650. #define SHIFT_KP_PLUS        (0xB6+EFLAG)
  1651. #define SHIFT_KP_MINUS        (0xB7+EFLAG)
  1652. #define SHIFT_KP_STAR        (0xB8+EFLAG)
  1653. #define SHIFT_KP_SLASH        (0xB9+EFLAG)
  1654. #define CTRL_KP_ENTER        (0xBA+EFLAG)
  1655. #define SHIFT_CTRL_KP_ENTER    (0xBB+EFLAG)
  1656.  
  1657.  
  1658.  
  1659. /* ---------- EVENT STUFF ------------- */
  1660.  
  1661. typedef union {        /* 8 bytes (a long long ) */
  1662.     _LONGLONG_ item;
  1663.     short m_type;
  1664.     STOR s;
  1665. #if 0
  1666. #define e_keychar s.a5.b[4]
  1667. #define e_keyflag s.a5.b[5]
  1668. #define m_sparam s.a3.s1
  1669. #define m_lparam s.a4.s1
  1670. #else
  1671. #define E_KEYCHAR s.a5.b[4]
  1672. #define E_KEYFLAG s.a5.b[5]
  1673. #define M_SPARAM s.a3.s1
  1674. #define M_LPARAM s.a4.s1
  1675. #endif
  1676.     struct {
  1677.         unsigned short type;
  1678.         unsigned char kbstat;
  1679.         unsigned char mask;
  1680.         short xpos;
  1681.         short ypos;
  1682. #if 0
  1683. #define e_type e.type
  1684. #define e_kbstat e.kbstat
  1685. #define e_mask e.mask
  1686. #define e_xpos e.xpos
  1687. #define e_ypos e.ypos
  1688. #define e_keycode e.xpos
  1689. #else
  1690. #define E_TYPE e.type
  1691. #define E_KBSTAT e.kbstat
  1692. #define E_MASK e.mask
  1693. #define E_XPOS e.xpos
  1694. #define E_YPOS e.ypos
  1695. #define E_KEYCODE e.xpos
  1696. #endif
  1697.     } e;
  1698. } RawEvent, CFmsg;
  1699.  
  1700.  
  1701. #define M_MOTION        (0x001)
  1702. #define M_LEFT_DOWN        (0x002)
  1703. #define M_LEFT_UP        (0x004)
  1704. #define M_RIGHT_DOWN    (0x008)
  1705. #define M_RIGHT_UP        (0x010)
  1706. #define M_MIDDLE_DOWN    (0x020)
  1707. #define M_MIDDLE_UP        (0x040)
  1708. #define M_BUTTON_DOWN    (M_LEFT_DOWN | M_MIDDLE_DOWN | M_RIGHT_DOWN)
  1709. #define M_BUTTON_UP        (M_LEFT_UP   | M_MIDDLE_UP   | M_RIGHT_UP)
  1710. #define M_BUTTON_CHANGE (M_BUTTON_UP | M_BUTTON_DOWN )
  1711.  
  1712. #define KB_RIGHTSHIFT    (0x01)        /* right shift key depressed */
  1713. #define KB_LEFTSHIFT    (0x02)        /* left shift key depressed */
  1714. #define KB_CTRL            (0x04)        /* CTRL depressed */
  1715. #define KB_ALT            (0x08)        /* ALT depressed */
  1716. #define KB_SCROLLOCK    (0x10)        /* SCROLL LOCK active */
  1717. #define KB_NUMLOCK        (0x20)        /* NUM LOCK active */
  1718. #define KB_CAPSLOCK        (0x40)        /* CAPS LOCK active */
  1719. #define GLBLKEY            (0x80)
  1720. #define KB_SHIFT        (KB_LEFTSHIFT | KB_RIGHTSHIFT)
  1721.  
  1722. /* A complicated CUA information word */
  1723. extern int AltDown;
  1724.  
  1725. typedef struct {
  1726.     unsigned short  width;
  1727.     unsigned short  height;
  1728.     unsigned short  number_of_colors;
  1729.     unsigned char   BIOS_mode;
  1730.     unsigned char   special;
  1731. } DRIVER_MODE_ENTRY;
  1732.  
  1733. /* Pointer to a millisecond unsigned long ticker */
  1734. extern unsigned long oxport_thread_msec;
  1735.  
  1736. int OXPORT_shift_state();
  1737. void OXPORT_deinit_kbd(long arg);
  1738. void OXPORT_init_kbd(long arg);
  1739. int OXPORT_was_kbd();
  1740. int OXPORT_get_kbd();
  1741. void OXPORT_flush_kbd(void);
  1742. void OXPORT_position_kb_cursor(int x, int y);
  1743. void OXPORT_get_kb_cursor_pos_shape(int *pos, int *shape);
  1744. void OXPORT_set_kb_cursor_shape(int shape);
  1745. void OXPORT_hide_kb_cursor();
  1746. void OXPORT_unhide_kb_cursor();
  1747. void OXPORT_direct_attr_text_output(int offset, short *buf, int len);
  1748. void OXPORT_bios_attr_text_output(int x, int y, short *buf, int len);
  1749.  
  1750. void OXPORT_read_image(void *dst, int x, int y, int wd, int ht, int dw);
  1751. void OXPORT_write_image(void *src, int x, int y, int wd, int ht, int sw);
  1752. void OXPORT_or_image(void *src, int x, int y, int wd, int ht, int sw);
  1753. void OXPORT_and_image(void *src, int x, int y, int wd, int ht, int sw);
  1754. void OXPORT_xor_image(void *src, int x, int y, int wd, int ht, int sw);
  1755.  
  1756. void OXPORT_deinit_events(long arg);
  1757. int OXPORT_init_events(long arg);
  1758. int OXPORT_was_event(void);
  1759. RawEvent OXPORT_get_event(void);
  1760.  
  1761. void OXPORT_set_mouse_cursor_shape(void *shape);
  1762. int OXPORT_register_mouse_cursor_shape(void *shape);
  1763. void OXPORT_set_mouse_limits(int x1, int y1, int x2, int y2);
  1764. void OXPORT_set_mouse_speed(int speed);
  1765. void OXPORT_set_mouse_accel(int thresh, int accel);
  1766. void OXPORT_disable_mouse(void);
  1767. void OXPORT_enable_mouse(void);
  1768. void OXPORT_set_mousepos(int x, int y);
  1769.  
  1770. int OXPORT_get_curr_screen_mode(void);
  1771. int OXPORT_get_curr_screen_cols(void);
  1772. int OXPORT_get_curr_screen_rows(void);
  1773. void OXPORT_get_video_modes(void);
  1774. void OXPORT_set_video_mode(int mode);
  1775. void OXPORT_set_ORIGvideo_mode(int mode);
  1776. void OXPORT_read_palette_register(int n, int *red, int *green, int *blue);
  1777. void OXPORT_write_palette_register(int n, int *red, int *green, int *blue);
  1778. void OXPORT_clear_screen(void);
  1779. void OXPORT_fill_screen_rect(int color, int x, int y, int w, int h);
  1780.  
  1781. void OXPORT_start_timer(void);
  1782. void OXPORT_stop_timer(void);
  1783. void OXPORT_set_thread_msec(int msec);
  1784. void OXPORT_compute_final_tick(void);
  1785. unsigned long OXPORT_get_clock_ticks(void);
  1786. unsigned long OXPORT_get_timestamp(void);
  1787. unsigned OXPORT_wait_msec(unsigned n);
  1788. void OXPORT_beep(int freq);
  1789. void OXPORT_beeplen(int freq, int msec);
  1790.  
  1791. void OXPORT_crash(char *msg);
  1792. void OXPORT_nulproc(void);
  1793.  
  1794. int CF_was_msg(void);
  1795. CFmsg CF_get_msg(void);
  1796. void CF_InitIO(long arg, _LONGLONG_ (*msgproc)());
  1797.  
  1798. #define CF_REMOTE_KEYBOARD (1)
  1799. #define CF_USE_EVENTS    (2)
  1800. #define CF_USE_MESSAGES    (4)
  1801. #define CF_USE_GUI        (8)
  1802. #define CF_ANSI_TEXT_OUTPUT    (16)
  1803. #define CF_BIOS_TEXT_OUTPUT (32)
  1804. #define CF_DIRECT_TEXT_OUTPUT (64)
  1805. #define CF_GRAPHIC_TEXT_OUTPUT (128)
  1806. #define CF_GRAPHIC_OUTPUT (256)
  1807. #define CF_TEXT_MODE (CF_ANSI_TEXT_OUTPUT|CF_BIOS_TEXT_OUTPUT|CF_DIRECT_TEXT_OUTPUT)
  1808. #define CF_GRAPHIC_MODE (CF_GRAPHIC_TEXT_OUTPUT|CF_GRAPHIC_OUTPUT)
  1809.  
  1810. extern _LONGLONG_
  1811. DeliverMessage(vobject to, CFmsg m);
  1812. extern void
  1813. QueueMessage(vobject to, CFmsg m);
  1814.  
  1815. #define SendEvent(to, msg, sparm, lparm) \
  1816. ({CFmsg it;it.E_TYPE=msg;it.M_SPARAM=(short)sparm;it.M_LPARAM=(long)lparm; \
  1817. DeliverMessage(to,it);})
  1818.  
  1819. #define PostEvent(to, msg, sparm, lparm) \
  1820. ({CFmsg it;it.E_TYPE=msg;it.M_SPARAM=(short)sparm;it.M_LPARAM=(long)lparm; \
  1821. QueueMessage(to,it);})
  1822.  
  1823. extern _LONGLONG_
  1824. ConstructCommand(vobject to, char *cmd, short sparm, long lparm, int flag);
  1825.  
  1826. #define SendCommand(to, cmd, sparm, lparm) \
  1827. ConstructCommand(to, #cmd, sparm, lparm, 0)
  1828.  
  1829. #define PostCommand(to, cmd, sparm, lparm) \
  1830. ConstructCommand(to, #cmd, sparm, lparm, 1)
  1831.  
  1832. extern vobject CaptureKeyboard(vobject self, int nochild);
  1833. extern void ReleaseKeyboard(vobject self, vobject prev);
  1834. extern vobject CaptureMouse(vobject self, int nochild);
  1835. extern void ReleaseMouse(vobject self, vobject prev);
  1836. extern void CaptureMotion(vobject self);
  1837. extern void ReleaseMotion(vobject self);
  1838. extern void CaptureClock(vobject self);
  1839. extern void ReleaseClock(vobject self);
  1840. extern void CaptureTicker(vobject self);
  1841. extern void ReleaseTicker(vobject self);
  1842. extern void EnterLeave(int flag);
  1843.  
  1844. /* ------------ Global coordinate macros -------------- */
  1845.  
  1846. #define SCREENXMAX _SCREENXMAX
  1847. #define SCREENYMAX _SCREENYMAX
  1848. #define SCREENHEIGHT _SCREENHEIGHT
  1849. #define SCREENWIDTH _SCREENWIDTH
  1850. #define EFFECTIVE_SCREENWIDTH _EFFECTIVE_SCREENWIDTH
  1851. #define EFFECTIVE_SCREENHEIGHT _EFFECTIVE_SCREENHEIGHT
  1852. #define GLOBALHEIGHT _GLOBALHEIGHT
  1853. #define GLOBALWIDTH _GLOBALWIDTH
  1854. #define FONTHEIGHT _FONTHEIGHT
  1855. #define FONTWIDTH _FONTWIDTH
  1856. #define CURCOLS _CURCOLS
  1857. #define CURROWS _CURROWS
  1858. #define MAXROWS _MAXROWS
  1859. #define MAXCOLS _MAXCOLS
  1860. #define LINEHEIGHT _LINEHEIGHT
  1861. #define CHARWIDTH _CHARWIDTH
  1862. #define GRIDWIDTH _GRIDWIDTH
  1863. #define GRIDHEIGHT _GRIDHEIGHT
  1864. #define GLOBALX _GLOBALX
  1865. #define GLOBALY _GLOBALY
  1866. #define UserXMin GLOBALX
  1867. #define UserYMin GLOBALY
  1868. #define UserXMax (GLOBALX+GLOBALWIDTH-1)
  1869. #define UserYMax (GLOBALY+GLOBALHEIGHT-1)
  1870. #define VBUF_SIZE (MAXROWS*MAXCOLS)
  1871. #define VIDEOMODE _VIDEOMODE
  1872. #define LOOK _LOOK
  1873. #define FEEL _FEEL
  1874. #define REMOTEFD _REMOTEFD
  1875.  
  1876. extern int GuiEnabled;
  1877. extern long AppArg;
  1878. extern int _SCREENXMAX;
  1879. extern int _SCREENYMAX;
  1880. extern int _SCREENHEIGHT;
  1881. extern int _SCREENWIDTH;
  1882. extern int _EFFECTIVE_SCREENWIDTH;
  1883. extern int _EFFECTIVE_SCREENHEIGHT;
  1884. extern int _GLOBALHEIGHT;
  1885. extern int _GLOBALWIDTH;
  1886. extern int _FONTHEIGHT;
  1887. extern int _FONTWIDTH;
  1888. extern int _CURCOLS;
  1889. extern int _CURROWS;
  1890. extern int _LINEHEIGHT;
  1891. extern int _CHARWIDTH;
  1892. extern int _GRIDWIDTH;
  1893. extern int _GRIDHEIGHT;
  1894. extern int _GLOBALX;
  1895. extern int _GLOBALY;
  1896. extern int _MAXROWS;
  1897. extern int _MAXCOLS;
  1898. extern int _VIDEOMODE;
  1899. extern int _LOOK;
  1900. extern int _FEEL;
  1901. extern int _REMOTEFD;
  1902. extern DRIVER_MODE_ENTRY *TextModes;
  1903. extern int numTextModes;
  1904. extern DRIVER_MODE_ENTRY *GraphicModes;
  1905. extern int numGraphicModes;
  1906. extern int MouseEnabled;
  1907.  
  1908. #define DEFAULT_LOOK 0
  1909. #define LOOK_TEXT1        1
  1910. #define LOOK_TEXT2        2
  1911. #define LOOK_TEXT3        3
  1912. #define LOOK_TEXT4        4
  1913. #define LOOK_GRAPHICS1    20
  1914. #define LOOK_GRAPHICS2    21
  1915. #define LOOK_GRAPHICS3    22
  1916. #define LOOK_GRAPHICS4    23
  1917. #define LOOK_GRAPHICS5    24
  1918.  
  1919. #define DEFAULT_FEEL 0
  1920. #define FEEL_CUA 1
  1921.  
  1922.  
  1923. #define rdiv(a,b) \
  1924.     ((a)/(b))
  1925. #define Scale(var,arg,num,den)    \
  1926. ((var) = rdiv(((arg) * (num)),(den)))
  1927.  
  1928. #define g2sx(x) \
  1929. Scale(x,x,EFFECTIVE_SCREENWIDTH,GLOBALWIDTH)
  1930. #define g2sy(y) \
  1931. Scale(y,y,EFFECTIVE_SCREENHEIGHT,GLOBALHEIGHT)
  1932. #define s2gx(x) \
  1933. Scale(x,x,GLOBALWIDTH,EFFECTIVE_SCREENWIDTH)
  1934. #define s2gy(y) \
  1935. Scale(y,y,GLOBALHEIGHT,EFFECTIVE_SCREENHEIGHT)
  1936. #define c2gx(x) \
  1937. Scale(x,x,GLOBALWIDTH,CURCOLS)
  1938. #define c2gy(y) \
  1939. Scale(y,y,GLOBALHEIGHT,CURROWS)
  1940. #define c2sx(x) \
  1941. Scale(x,x,EFFECTIVE_SCREENWIDTH,CURCOLS)
  1942. #define c2sy(y) \
  1943. Scale(y,y,EFFECTIVE_SCREENHEIGHT,CURROWS)
  1944. #define s2cx(x) \
  1945. Scale(x,x,1,FONTWIDTH)
  1946. #define s2cy(y) \
  1947. Scale(y,y,1,FONTHEIGHT)
  1948. #define g2cx(x) \
  1949. Scale(x,x,1,CHARWIDTH)
  1950. #define g2cy(y) \
  1951. Scale(y,y,1,LINEHEIGHT)
  1952.  
  1953.  
  1954. vobject
  1955. NewGuiClass(
  1956.     object cl,                 /* class                      */
  1957.     char *title,              /* window title or NULL       */
  1958.     int left, int top,        /* upper left coordinates     */
  1959.     int height, int width,    /* dimensions (global coords) */
  1960.     void *extension,          /* pointer to additional data */
  1961.     void *parent,             /* parent of window (a window)*/
  1962.     _LONGLONG_ (*msgproc)(),  /* message proc for user      */
  1963.     unsigned long attrib,     /* window attributes          */
  1964.     int look, int feel
  1965.     );
  1966.  
  1967. /* PARSER STUFF */
  1968. #define ASTMODE 1
  1969. #define LEXMODE 2
  1970. #define EOF_MARK       26   /* End of file character.                  */
  1971. #define ACTION         1           /* Call action function.            */
  1972. #define MAKENODE       2           /* Make a node.                     */
  1973. #define DELTREE        4           /* Delete the subtree.              */
  1974. #define PL_ACTION    0x10
  1975. #define PL_MAKENODE 0x20
  1976. #define PL_DELTREE  0x40
  1977. #define LEFT_ASSOC 0
  1978. #define RIGHT_ASSOC 1
  1979. #define NON_ASSOC 2
  1980. #define PARSER_STKSIZE 512
  1981. #define ASTMINADDR ((AstP)(100000))    /* lowest allowed address (line numbers here ) */
  1982.  
  1983. /*--- PARSER SYMBOL Structure. ---------------------------------------------*/
  1984.  
  1985. typedef struct                 /* Symbol table cell structure (4 bytes). */
  1986. {
  1987.    char   *name;        /* Pointer to name.               */
  1988. } PARSER_SYMBOL;
  1989.  
  1990. typedef struct
  1991. {
  1992.     int cnt;
  1993.     PARSER_SYMBOL *ptr;
  1994. } PARSER_SYMBOL_TABLE;
  1995.  
  1996. /*--- AST NODE Structure. --------------------------------------------------*/
  1997. #ifndef __ASTNODEH__
  1998. #define __ASTNODEH__
  1999. typedef union _datum { /* 16 bytes */
  2000.     STOR stor;
  2001.     CAT cat;
  2002.     struct {
  2003.         char d[16];
  2004.     } chr;
  2005.     struct {
  2006.         unsigned char d[16];
  2007.     } uchr;
  2008.     struct {
  2009.         short d[8];
  2010.     } shrt;
  2011.     struct {
  2012.         unsigned short d[8];
  2013.     } ushrt;
  2014.     struct {
  2015.         long d[4];
  2016.     } lng;
  2017.     struct {
  2018.         unsigned long d[4];
  2019.     } ulng;
  2020.     struct {
  2021.         _LONGLONG_ d[2];
  2022.     } lnglng;
  2023.     struct {
  2024.         unsigned _LONGLONG_ d[2];
  2025.     } ulnglng;
  2026.     struct {
  2027.         void *d[4];
  2028.     } ptr;
  2029.     unsigned char    Uuchar;
  2030.     char            Uchar;
  2031.     unsigned short    Uushort;
  2032.     short            Ushort;
  2033.     unsigned int    Uuint;
  2034.     int                Uint;
  2035.     unsigned long    Uulong;
  2036.     long            Ulong;
  2037.     void *            Upointer;
  2038.     float            Ufloat;
  2039.     double            Udouble;
  2040.     unsigned _LONGLONG_ Uulonglong;
  2041.     _LONGLONG_        Ulonglong;
  2042.  
  2043. #if SUPPORT_LONG_DOUBLE
  2044.     long double        Ulongdouble;
  2045. #endif
  2046. } DATUM, *PDATUM;
  2047.  
  2048. typedef struct  ast_node 
  2049. {/* MINIMUM AST Node structure. (20 bytes)  */
  2050.    struct ast_node *right;
  2051.    struct ast_node *down;
  2052.    short  symb;                /* Symbol number */
  2053.    short    id;                /* Nodeid  ((id<<6)|subid) */
  2054.    unsigned short Tindx;     /* Terminal type (is a symbol number) */
  2055.    unsigned short lineno;    /* line number */
  2056.    unsigned short flags;    /* general purpose flags */
  2057.    unsigned char fileno;    /* File number */
  2058.    unsigned char colno;        /* column of input text */
  2059. } AST_NODE, *AstP;
  2060.  
  2061. #endif /* __ASTNODEH__ */
  2062.  
  2063. typedef struct
  2064. {
  2065.     int cnt;
  2066.     int freecnt;
  2067.     AstP free;
  2068. } PARSER_AST_TABLE;
  2069.  
  2070. /* The structure at the beginning of each set of tables in the .lod file */
  2071. typedef struct lodtable {
  2072.  
  2073. long    type;        /* type of tables, LEXMODE, ASTMODE etc */
  2074. long    next;        /* offset from start of current structure to next structure */
  2075.  
  2076. /* Offsets to tables in the file */
  2077. long    t_D_red;
  2078. long    t_R_start;
  2079. long    t_R_symbol;
  2080. long    t_R_prod;
  2081. long    t_rBase;
  2082. long    t_Head;
  2083. long    t_MT_beg;
  2084. long    t_MT_tran;
  2085. long    t_MN_beg;
  2086. long    t_MN_tran;
  2087. long    t_M_bits;
  2088. long    t_G_symbol;
  2089. long    t_PL;
  2090. long    t_LGT;
  2091. long    n_actions;
  2092.  
  2093. long    t_ACTIONS;
  2094. long    t_ACTIONSTRINGS;
  2095. long    t_ia_numb;            /* unused */
  2096. long    t_oa_numb;            /* unused */
  2097. long    t_ia_proc;            /* unused */
  2098. long    t_oa_proc;            /* unused */
  2099. long    t_node_proc;        /* unused */
  2100.  
  2101. /* constants */
  2102. long    TM;
  2103. long    bitwords;
  2104. long    n_terms;
  2105. long    n_vars;
  2106. long    n_symbs;
  2107. long    n_rules;
  2108. long    n_states;
  2109. long    maxtoken;
  2110. } LODTABLE;
  2111. typedef struct _pactions {
  2112.     void (*func)();
  2113.     int args[9];
  2114. } *PACTIONS;
  2115.  
  2116. typedef struct {
  2117.     PARSER_AST_TABLE pat;
  2118.     PARSER_SYMBOL_TABLE pst;
  2119.     AstP    root;
  2120.     int        category;
  2121.     char    language[32];
  2122.  
  2123.     struct lodtable *lod_table;
  2124.     void    *in_file;
  2125.     void    *symhandle;
  2126.     void    *ROOT;
  2127.     unsigned int        line_numb;
  2128.     unsigned int        line_char;
  2129.     unsigned int        line_file;    /* entry in the 'files' array below */
  2130.     int        parsecnt;
  2131.     int        n_actions;
  2132.     PACTIONS ACTIONS;
  2133.     char     *ACTIONSTRINGS;
  2134.     struct ptable    *ptab;
  2135.     struct ltable    *ltab;
  2136.     int        LSP;
  2137.     int        errors;
  2138. #define PARSER_DEBUG 1
  2139. #define LEXER_DEBUG 2
  2140. #define NO_DYNAMIC_TOKENS 4
  2141.     int     debug;
  2142.     int     lastsymnum;
  2143.     int        lastclass;
  2144.     char    *actionerr;
  2145.     int        maxfile;
  2146.     int        numfiles;
  2147.     int        curfile;
  2148.     int        totsymlen;
  2149.     int        hashdups;
  2150.     short    L_stack[4];
  2151.     short    files[64];    /* contains symbol numbers of filenames */
  2152.     short    blockinID;
  2153.     short    blockoutID;
  2154.     int        blocklevel; /* block nesting level */
  2155.     char    *chunkbase;    /* symbol text is stored in chunks during parse */
  2156.     char    *chunkend;
  2157.     char    *symbase;
  2158.     char    *symend;
  2159.     _LONGLONG_    symhash;
  2160.     unsigned int symspot;
  2161.     int        (*readfunc)();    /* stream reader function */
  2162.     int        (*writefunc)();    /* stream writer function */
  2163.     int        (*readcharfunc)();
  2164.     int        (*writecharfuc)();
  2165.     int        (*statfunc)();
  2166.     int        fstack_depth;
  2167.     int        fstack[64];        /* for included file nesting */
  2168.     int        obj_inbufcnt;
  2169.     int        obj_inbufsize;
  2170.     unsigned char    obj_inbuf[128];
  2171.     int        astchunk;
  2172.     int        symbolchunk;
  2173.     int        textchunk;
  2174.     int        astsize;
  2175. } PG;
  2176.  
  2177. typedef struct ptable {
  2178.  
  2179. /* Pointers to tables produced by the parser generator     */
  2180.  
  2181. PG        *pg;        /* Pointer to multiparser global variable structure */
  2182. short    *D_red;     /* Default reduction.                        */
  2183. short    *R_start;   /* Reduction start.                          */
  2184. short    *R_symbol;  /* Reduction symbol.                         */
  2185. short    *R_prod;    /* Reduction production.                     */
  2186. short    *rBase;
  2187. short    *Head;         /* Head symbol number for a production.   */
  2188. short    *MT_beg;
  2189. short    *MT_tran;
  2190. short    *MN_beg;
  2191. short    *MN_tran;
  2192. short    *M_bits;
  2193. long    *G_symbol;        /* Symbol names of the grammar            */
  2194. short     *PL;            /* Production length less one.            */
  2195. short    *LGT;
  2196. long    *ACTIONS;
  2197. char    *ACTIONSTRINGS;
  2198.  
  2199. /* constants provided by the load module */
  2200. short    TM;
  2201. short    bitwords;
  2202. int        n_terms;
  2203. int        n_vars;
  2204. int        n_symbs;
  2205. int        n_states;
  2206. int        n_rules;
  2207. int        n_actions;
  2208. short    maxtoken;
  2209.  
  2210. /* variables */
  2211.  
  2212. short    rule;
  2213. short    state;
  2214. short    token;
  2215.  
  2216. /* Pointers used during parse */
  2217.  
  2218. short    *SS;                /* State stack pointer.             */
  2219. short    SStop[PARSER_STKSIZE];
  2220. short    *SSmax;             /* State stack maximum height.      */
  2221.  
  2222. /* PARSER AND LEXER TABLES MUST BE THE SAME UP TO THIS POINT */
  2223.  
  2224. AstP    *NS;                /* AST node stack pointer.          */
  2225. AstP    NStop[PARSER_STKSIZE];
  2226. short    *LS;
  2227. short    LStop[PARSER_STKSIZE];
  2228. short    *Rs;
  2229. short    RStop[PARSER_STKSIZE];
  2230. int        xx;
  2231. int        linksize;
  2232. AstP    *link;
  2233. AstP    node;
  2234.  
  2235. } PTABLE;
  2236.  
  2237. typedef struct ltable {
  2238.  
  2239. /* Pointers to tables produced by the parser generator     */
  2240.  
  2241. PG        *pg;        /* Pointer to multiparser global variable structure */
  2242. short    *D_red;     /* Default reduction.                        */
  2243. short    *R_start;   /* Reduction start.                          */
  2244. short    *R_symbol;  /* Reduction symbol.                         */
  2245. short    *R_prod;    /* Reduction production.                     */
  2246. short    *rBase;
  2247. short    *Head;         /* Head symbol number for a production.   */
  2248. short    *MT_beg;
  2249. short    *MT_tran;
  2250. short    *MN_beg;
  2251. short    *MN_tran;
  2252. short    *M_bits;
  2253. long    *G_symbol;        /* Symbol names of the grammar            */
  2254. short     *PL;            /* Production length less one.            */
  2255. short    *LGT;
  2256. long    *ACTIONS;
  2257. char    *ACTIONSTRINGS;
  2258.  
  2259. /* constants provided by the load module */
  2260. short    TM;
  2261. short    bitwords;
  2262. int        n_terms;
  2263. int        n_vars;
  2264. int        n_symbs;
  2265. int        n_states;
  2266. int        n_rules;
  2267. int        n_actions;
  2268. short    maxtoken;
  2269.  
  2270. /* Variables */
  2271.  
  2272. short    rule;
  2273. short    state;
  2274. short    token;
  2275.  
  2276.  
  2277. /* Pointers used during lex */
  2278.  
  2279. short    *SS;                /* State stack pointer.             */
  2280. short    SStop[PARSER_STKSIZE];
  2281. short    *SSmax;             /* State stack maximum height.      */
  2282.  
  2283. /* PARSER AND LEXER TABLES MUST BE THE SAME UP TO THIS POINT */
  2284.  
  2285. short    lextoken;
  2286. #if 0
  2287. char    ibuf[512];
  2288. #endif
  2289. } LTABLE;
  2290.  
  2291. #define ASTVARS(n) AstP curnode, pstack[n], *stack=pstack
  2292. #define SYMBOLCOUNT (pg->pst.cnt)
  2293. #define PARSERSYMBOLS (pg->pst.ptr)
  2294. #define MARK(sp) (*(++sp) = (AstP)0)
  2295. #define STACKTOP(sp) (**sp)
  2296. #define TOPDOWN(n) AstTopDown(&stack, n, pg)
  2297. #define BOTTOMUP(n) AstBottomUp(&stack, n, pg)
  2298. #define MARKAST MARK(stack)
  2299. #define DOWNAST (curnode = TOPDOWN(curnode))
  2300. #define UPAST (curnode = BOTTOMUP(curnode))
  2301. #define IGNOREBRANCH (curnode = 0)
  2302. #define nID(symb) _cat_(LANGUAGE, symb)
  2303. #define fID(symb) _cat_(symb, LANGUAGE)
  2304. #define lName        _cname1_(LANGUAGE)
  2305.  
  2306. #define NODERIGHT(n) (((AstP)n)->right)
  2307. #define NODEDOWN(n) (((AstP)n)->down)
  2308. #define ISEQUAL(n, s) (((AstP)n)->id == s)
  2309. #define NODEID (((AstP)curnode)->id)
  2310. #define NODECLASS (((AstP)curnode)->id & 0xffc0)
  2311. #define NODEFLAGS (((AstP)curnode)->flags)
  2312. #define NODESYMB (((AstP)curnode)->symb)
  2313.  
  2314. AstP NewAstNode(PG *pg, int id, int symb);
  2315. int NewParserSymbol(PG *pg, const char *name);
  2316. void ParserPush(PG *pg, int data);
  2317. int ParserPop(PG *pg);
  2318. int ParserStackdepth(PG *pg);
  2319.  
  2320. void *NewParserSymTable(PG *pg, int size);
  2321.  
  2322. AstP AstTopDown(AstP **sp, const AstP cur_node, PG *pg);
  2323. AstP AstBottomUp(AstP **sp, const AstP start_node, PG *pg);
  2324. void PrintAst (PG *pg, AstP root, void *file, int ptrs);
  2325. void HowBigAst(PG *pg, void *file);
  2326. void PruneAstTree(PG *pg,AstP root,int preserve_root,const AstP top);
  2327. void FreeAstNode(PG *pg, AstP node);
  2328. char *GetH_symbol(PG *pg, int numb);
  2329. void DelLastParserSymbol(PG *pg);
  2330. int AstPackSize(PG *pg);
  2331. void *PackAst(PG *pg, void *buf);
  2332.  
  2333. /* END: PARSER STUFF */
  2334.  
  2335. #ifndef __OXCCFUNCSH__
  2336. #define __OXCCFUNCSH__
  2337. extern void oxcc_proc_syms(void *iv, unsigned namespace, void (*func)());
  2338. /* func(void *node, int symb, void *container) */
  2339.  
  2340. extern void oxcc_proc_ptr_info(void *iv, void (*func)());
  2341. /* func(void *addr, void *mino, void *maxo) */
  2342.  
  2343. extern void oxcc_proc_mallocs(void *iv, void (*func)());
  2344. /* func(void *loc, int size, DATUM *ip) */
  2345.  
  2346. extern int oxcc(int argc, char **argv);
  2347. extern void *oxcc_get_pg(void *iv);
  2348. extern void oxcc_debug(void *iv, int flags);
  2349. extern void oxcc_enable_trace(void *iv);
  2350. extern void oxcc_disable_trace(void *iv);
  2351.  
  2352. extern void *oxcc_open_instance(void);
  2353. extern void oxcc_set_options(void *iv, char *opts);
  2354. extern int oxcc_preproc_file(void *iv, void *is, void *os, void *es,
  2355.                                 int argc, char **argv);
  2356. extern int oxcc_parse_file(void *iv, void *is, void *es, char *filename);
  2357. extern void oxcc_print_parse_errors(void *iv, void *es);
  2358. extern int oxcc_check_ast_tree(void *iv, void *es, char *filename);
  2359. extern int oxcc_init_outers(void *iv, void *es);
  2360. extern int oxcc_run_tree(void *iv, void *es, char *fname, char *args, char *rnm);
  2361. extern int oxcc_gen_code(void *iv, void *es, char *filename, void *os);
  2362. extern void oxcc_cleanup_parse(void *iv);
  2363. extern void oxcc_close_codefile(void *iv);
  2364. extern void oxcc_close_instance(void *iv);
  2365.  
  2366. extern void oxcc_print_ast(void *iv, void *os, int flag);
  2367. extern void *oxcc_get_ast_root(void *iv);
  2368. extern int oxcc_eval_expr(void *iv, void *buf, double *result, void *es);
  2369. extern void *__builtin_iv(void);
  2370. extern void *__builtin_pg(void);
  2371. #endif /* __OXCCFUNCSH__ */
  2372.  
  2373. #ifdef __cplusplus
  2374. }
  2375. #endif
  2376.  
  2377. #ifndef _OXSYMS_H
  2378. #define _OXSYMS_H
  2379.  
  2380. #ifdef __cplusplus
  2381. extern "C" {
  2382. #endif
  2383.  
  2384. void* oxNewSymTable(int category, int nbins);
  2385. int oxSymFind(void *tbl, void *key, void *result);
  2386. int oxSymFindRange(void *tbl, void *key, void *result);
  2387. void *oxSymInsert(void *tbl, void *key, void *value, int datsiz);
  2388. int oxStringInsert(void *tbl, char *string, void *result);
  2389. int oxStringFind(void *tbl, char *string, void *result);
  2390. void oxSymDelete(void *tbl, void *key);
  2391. int oxSymHead(void *tbl);
  2392. int oxSymNext(void *tbl);
  2393. void oxSymGetMark(void *tbl, void *markptr);
  2394. int oxSymMarkNext(void *tbl, void *mark);
  2395. void oxSymSetMark(void *tbl, void *markptr);
  2396. void oxSymKey(void *tbl, void *keyptr);
  2397. void oxSymValue(void *tbl, void *datptr);
  2398.  
  2399. #ifdef __cplusplus
  2400. }
  2401. #endif
  2402.  
  2403. #endif /* _OXSYMS_H */
  2404.